2010-08-13 16 views
29

Używam sesji php na mojej stronie internetowej i wygląda na to, że "znikają" w losowych odstępach czasu. Nie wiem, czy wyczekują czasu z powodu braku aktywności lub jeśli coś jest nie tak z moim kodem, ale czy istnieje sposób kontrolowania sesji, kiedy wygasną?Sesje PHP zbyt szybko tracą czas

Jak mogę umieścić coś w moim kodzie lub zmienić coś w pliku php.ini?

Aktualizacja - Tak więc i aktualizuję tutaj, zmieniłem gospodarzy i magicznie sesje zaczęły działać. Nie mam pojęcia, co było nie tak, ale najwyraźniej nie chcieli działać poprawnie.

+2

Znajdziesz tu odpowiedź: http://stackoverflow.com/questions/1516266/how-long-will-my-session-last/1516284 – svens

+2

To było niesamowite dzięki. W rzeczywistości okazało się to niezwykle pomocne: http://stackoverflow.com/questions/520237/how-do-i-expire-a-php-session-after-30-minutes/1270960#1270960 – jefffan24

+1

To było nawet bardziej niesamowite, dzięki :) – svens

Odpowiedz

42

Losowa utrata ważności jest klasycznym objawem katalogu danych sesji udostępnianego przez kilka aplikacji: ten z najkrótszym czasem session.gc_maxlifetime prawdopodobnie usunie dane z innych aplikacji. Powód:

  1. Domyślnie PHP przechowuje pliki sesji w katalogu tymczasowym systemu.
  2. polecenie wbudowane obsługi plików nie śledzić, kto jest właścicielem, co plik sesji (to po prostu pasuje do nazwy pliku z ID sesji):

    Nothing bug good old files

Moja rada jest taka, że ​​można skonfigurować niestandardowe prywatną sesję katalog dla twojej aplikacji. Można to zrobić za pomocą session_save_path() function lub ustawiając session.save_path configuration directive. Sprawdź dokumentację swojego frameworka, aby uzyskać dokładne informacje o tym, jak to zrobić we własnej bazie kodów.

+0

Sugerujesz wstawienie tego na każdej stronie? – JM4

+3

@ JM4 - Zajrzyj do rodziny instrukcji [include] (http://php.net/include). –

+0

rozumiem, obejmują i wymaga. Jeśli OP będzie miał setki lub tysiące stron, będzie to koszmar, jeśli nie niemożliwe. Znajdź i zamień jest możliwe, zakładając, że wszystkie strony mają pewien rodzaj podstawowej struktury, ale nadal wydaje się, że jest to naprawdę dziwny sposób. – JM4

2

spróbuje użyć tę część kodu:

session_start(); 
    $inactive = 600; 
    $session_life = time() - $_SESSION['timeout']; 
    if($session_life > $inactive) { 
    session_destroy(); 
    header("Location: logoutpage.php"); 
    } 
    $_SESSION['timeout']=time(); 
+0

OK, więc mam stronę php biblioteki, która jest zawarta na każdej stronie witryny, zakładam, że za każdym razem, gdy się logują, zacznę limit czasu sesji. Czy używałbym tego fragmentu kodu w bibliotece, aby za każdym razem, gdy ładuje stronę, aktualizuje swoją aktywność? – jefffan24

+0

Spowoduje to zniszczenie każdej sesji po 10 minutach bezczynności. Usuń wszystko, spodziewając się pierwszej i ostatniej linii tego kodu, a będziesz miał realną odpowiedź na to pytanie. – svens

+2

I dla umiłowania dobra, przetestuj istnienie zmiennych przed ich użyciem! Zakładając, że $ _SESSION ['timeout'] będzie ważne, to Bad (TM) – Fake51

6

Można go użyć, aby technika zgodny aplikacja według Ciebie .. Trzeba dokonać kilku zmian w zależności od systemu

// Get the current Session Timeout Value 
$currentTimeoutInSecs = ini_get(’session.gc_maxlifetime’); 

Zmień wartość limitu czasu sesji:

// Change the session timeout value to 30 minutes // 8*60*60 = 8 hours 
ini_set(’session.gc_maxlifetime’, 30*60); 
//————————————————————————————– 

// php.ini setting required for session timeout. 

ini_set(‘session.gc_maxlifetime’,30); 
ini_set(‘session.gc_probability’,1); 
ini_set(‘session.gc_divisor’,1); 

//if you want to change the session.cookie_lifetime. 
//This required in some common file because to get the session values in whole application we need to  write session_start(); to each file then only will get $_SESSION global variable values. 

$sessionCookieExpireTime=8*60*60; 
session_set_cookie_params($sessionCookieExpireTime); 
session_start(); 

// Reset the expiration time upon page load //session_name() is default name of session PHPSESSID 

if (isset($_COOKIE[session_name()])) 
    setcookie(session_name(), $_COOKIE[session_name()], time() + $sessionCookieExpireTime, “/”); 
    //————————————————————————————– 
    //To get the session cookie set param values. 

    $CookieInfo = session_get_cookie_params(); 

    echo “<pre>”; 
    echo “Session information session_get_cookie_params function :: <br />”; 
    print_r($CookieInfo); 
    echo “</pre>”; 

Wszystkie najlepsze !!!!

+4

To faktycznie robi. Prawdopodobnie myślisz o wygaśnięciu plików cookie. –

12

Debian używa zadania cron do automatycznego wygasania sesji w bezpieczny sposób. Jeśli używasz Debiana, spójrz na /etc/cron.d/php5.

+0

Ubuntu posiada również '/ etc/cron.d/php', który używa' session.gc_maxlifetime' w '/ etc/php/7.0/fpm/php.ini' do usuwania sesji z'/var/lib/php/sessions '. –