Terminy sesji w PHP: najlepsze praktyki

Jaka jest rzeczywista różnica między session.gc_maxlifetime a session_cache_expire() ?

Załóżmy, że chcę, aby sesja użytkowników była nieważna po 15 minutach braku aktywności(a nie 15 po jej pierwszym otwarciu). Który mi pomoże?

Wiem również, że mogę zrobić session_set_cookie_params(), które mogą ustawić plik cookie użytkownika, aby wygasł w pewnym czasie. Jednak wygasający plik cookie i rzeczywista wygasająca sesja po stronie serwera nie są takie same; czy to również usuwa sesję, gdy cookie wygasło?

Inne rozwiązanie, jakie mam, jest proste $_SESSION['last_time'] = time() przy każdym żądaniu i porównując sesję z bieżącym czasem, usuwając sesję na tej podstawie. Miałem nadzieję, że istnieje bardziej "wbudowany" mechanizm obsługi tego.

Dzięki.
Author: Chad, 2009-08-06

4 answers

Za każdym razem, gdy session_start jest wywoływany znacznik czasu sesji (jeśli istnieje) jest aktualizowany, który jest używany do obliczania if sesji.gc_maxlifetime został przekroczony.

Co ważniejsze, nie można polegać na sesji, która wygaśnie po sesji.gc_maxlifetime czas został przekroczony.

PHP uruchamia garbage collection na wygasłych sesjach po załadowaniu bieżącej sesji i przy użyciu sesji .sesja gc_probability i .gc_divisor oblicza / align = "left" / Domyślnie jest to Prawdopodobieństwo 1%.

Jeśli masz małą liczbę odwiedzających, istnieje prawdopodobieństwo, że nieaktywny użytkownik może uzyskać dostęp do sesji, która powinna wygasnąć i zostać usunięta. Jeśli jest to dla Ciebie ważne, musisz zapisać znacznik czasu w sesji i obliczyć, w jaki sposób log użytkownik był nieaktywny.

Ten przykład zastępuje session_start i wymusza limit czasu:

function my_session_start($timeout = 1440) {
    ini_set('session.gc_maxlifetime', $timeout);
    session_start();

    if (isset($_SESSION['timeout_idle']) && $_SESSION['timeout_idle'] < time()) {
        session_destroy();
        session_start();
        session_regenerate_id();
        $_SESSION = array();
    }

    $_SESSION['timeout_idle'] = time() + $timeout;
}
 40
Author: Glass Robot,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-06 04:13:09

Spędziłem trochę czasu szukając dobrej odpowiedzi na to, jak php.ustawienia serwera ini sprawiają sesje wygasają. Znalazłem dużo informacji, ale zajęło trochę czasu, aby dowiedzieć się, dlaczego ustawienia działają tak,jak robią. Jeśli jesteś taki jak ja, to może Ci pomóc:

Sesje są przechowywane jako pliki cookie (Pliki na komputerze klienta) lub po stronie serwera jako pliki na serwerze. Obie metody mają zalety i wady.

Dla sesji przechowywanych na serwerze używane są trzy zmienne.

Sesja.gc_probability sesja.gc_divisor sesja.gc_maxlifetime

(sesja.gc_probability / session.gc_divisor) daje prawdopodobieństwo, że rutyna zbierania śmieci będzie działać. Kiedy Śmieciarz działa, to sprawdza, czy pliki sesji nie były dostępne przez co najmniej sesję.gc_maxlifetime i usuwa je.

To wszystko jest wyjaśnione dość dobrze w postach na forum (ten szczególnie!)- Ale pojawiają się następujące pytania:

1.) How is that prawdopodobieństwo zastosowane? Kiedy serwer rzuca kostką?

A: serwer rzuca kostką za każdym razem, gdy wywołana jest funkcja session_start () podczas każdej aktywnej sesji na serwerze. Więc to oznacza, że powinieneś zobaczyć śmieci. kolektor uruchamia się mniej więcej raz na każde 100 razy, gdy wywołana jest funkcja session_start() jeśli masz domyślną sesję.gc_probability = 1 i sesja.gc_divisor = 100

2.) Co dzieje się na serwerach o małej objętości?

A: po wywołaniu session_start() najpierw odświeża sesji i sprawia, że wartości sesji dostępne dla Ciebie. To aktualizuje czas w pliku sesji na serwer. Następnie rzuca kostką i jeśli wygra (1 na 100 szans) nazywa garbage collector. Garbage collector następnie sprawdza wszystkie pliki identyfikatorów sesji i sprawdza, czy są wszystkie, które kwalifikują się do usunięcia.

Oznacza to, że jeśli jesteś jedyną osobą na serwerze, Twoja sesja będzie nigdy nie idź nieaktywny i pojawi się tak, jakby zmiana ustawień nie efekt. Powiedzmy, że zmienisz sesję.gc_maxlifetime do 10 i sesji.gc_probability do 100. Oznacza to, że istnieje 100% szansa, że garbage collector uruchomi się i to usunie wszystkie pliki sesji, które nie były dostępne w ciągu ostatnich 10 sekund.

Jeśli jesteś jedynym na serwerze, Twoja sesja nie zostanie usunięta. Potrzebujesz co najmniej 1 Inna aktywna sesja uruchomiona, aby twoja stała się nieaktywna.

Więc w zasadzie, na serwerze o małej głośności lub w czasie małej głośności-to może być dużo dłużej niż sesja.gc_maxlifetime przed uruchomieniem garbage collector i sesje są faktycznie usuwane. I nie wiedząc jak to działa, może wydaje ci się całkowicie przypadkowy.

3. Dlaczego używają prawdopodobieństwa?

Odp: Wydajność. Na wyższym serwerze nie chcesz garbage collector uruchamiane na każdym żądaniu funkcji session_start(). To spowolni serwer niepotrzebnie. Więc w zależności od wolumenu serwera możesz zwiększyć lub zmniejszyć prawdopodobieństwo, że Śmieciarz działa.

Mam nadzieję,że to wszystko łączy dla Ciebie. "If you' re like me and you tried" sesja.gc_maxlifetime i nie wyszło (bo próbowałeś się na serwerze deweloperskim, aby nikomu nie przeszkadzać), następnie ten post mam nadzieję, że zaoszczędzisz trochę drapania w głowie.

Powodzenia!

 57
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-01 18:20:01

sesja.gc_maxlifetime jest oparte na ostatnim czasie modyfikacji pliku sesji. Tak więc za każdym razem, gdy plik sesji jest modyfikowany lub wywołana jest metoda session_start () na oddzielnej stronie, odliczanie do gc_maxlifetime zaczyna się od nowa, a użytkownik pozostaje "zalogowany". To jest wartość, której szukasz. Możesz to zmodyfikować poprzez ini_set () w plikach php lub edytować php.ini jeśli masz do niego dostęp

session_cache_expire () kontroluje tylko nagłówek HTTP "Expires". To nagłówek określa, jak długo pobrana zawartość strony pozostaje w pamięci podręcznej przeglądarki użytkownika.

 6
Author: Mark,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-06 01:23:04

Aby sprawdzić bieżące wartości, ten kod będzie pomocny:

$gc_maxlifetime = ini_get('session.gc_maxlifetime');
$gc_probability = ini_get('session.gc_probability');
$gc_divisor     = ini_get('session.gc_divisor');
 1
Author: NXT,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-15 21:20:34