2011-12-23 14 views
7

Mam kilka kilka pytanie o sesjach PHP:kilka pytań dotyczących sesji PHP

  1. Ponieważ wartość domyślna dla session.gc_maxlifetime jest 24 min to znaczy, że każdy plik sesji nie jest modyfikowany przez 24 min zostaną usunięte, a sesja wygaśnie automatycznie.

  2. Jeśli użyję w moim kodzie session_destroy(), sesja zostanie anulowana, ale sam plik sesji nie zostanie usunięty, dopóki nie minie 24 minuty od ostatniej modyfikacji.

  3. Jedynym sposobem przedłużenia czasu życia sesji (ponad 24 min) jest przedłużenie session.gc_maxlifetime na większą wartość.

Czy wszystko jest poprawne, czy też coś złego w tym stanie?

Również jeśli przechowuję moje sesje w bazie danych (używając session_set_save_handler()), czy wszystkie te zasady będą miały do ​​nich zastosowanie?

Odpowiedz

5
  1. Prawie. Plik (sesja) nie zostanie natychmiast usunięty, co określają: session.gc_probability i session.gc_divisor.

  2. No, sesja będzie minął, ale usunięcie pliku sesja jest określana jak wskazano w poprzednim punkcie

  3. To jest zwykle prawidłowa, ale jeśli było zaimplementować własną obsługi sesji, można zmienić zachowanie ważności sesji nawet w taki sposób, że session.gc_maxlifetime jest ignorowany

Przechowywanie sesji w dB nie powinien zmieniać te reguły, ale może rozciągnąć je trochę, jeśli chcesz.

edit:

To jest mniej więcej w jaki sposób można zarejestrować swoją obsługi sesji (handler bycia klasa) i wtedy robić, co chcesz z nim

pierwsze, załóżmy, że mamy klasę, że będą sesje obsługi dla naszej aplikacji.

class MySession { 
    function open($save_path, $session_name) { 
    } 

    function close() { 
    } 

    function read($id) { 
    } 

    function write($id, $sess_data) { 
    } 

    function destroy($id) { 
    } 

    function gc($maxlifetime) { 
    } 
} 

Aby zarejestrować obsługi w PHP, wystarczy tylko zadzwonić session_set_save_handler funkcji, jak to w naszym przypadku:

// register the session handler 
$sess = new MySession(); 
session_set_save_handler(array($sess, 'open'), 
        array($sess, 'close'), 
        array($sess, 'read'), 
        array($sess, 'write'), 
        array($sess, 'destroy'), 
        array($sess, 'gc')); 

Należy zauważyć, że nie są w rzeczywistości lepsze sposoby, aby zarejestrować samej obsługi, można rób to nawet w konstruktorze twojej klasy lub na wiele innych sposobów. Ale zakładam, że nie o to tu chodzi.

Ważne jest to, że chociaż PHP podaje potrzebne zmienne odpowiadające standardowemu zachowaniu mechanizmu zarządzania sesją, nie musisz tego szanować (nie polecam tego).

Aby odpowiedzieć poniżej komentarz, ignoruje parametr maxlifetime, zignorować, że w metodzie GC i stosowania cokolwiek uznają za konieczne/prawo, na przykład (przy użyciu kodu db pseudo):

function gc($maxlifetime) { 
    $sql = "DELETE * FROM MySession WHERE lastAccess < NOW()-3600"; 
    // execute the query, say I have PDO instance in $dbh variable 
    $dbh->execute($sql); 
} 

voila, po prostu całkowicie omijałeś ustawienia sesji PHP, robiąc to sam.

+0

Dzięki za odpowiedź. Jeszcze jedno pytanie: Czy mógłbyś wyjaśnić więcej na temat punktu 3 w swojej odpowiedzi? Obecnie używam domyślnych konfiguracji do zarządzania sesją. Nie mam wpływu na php.ini, ponieważ jest to serwer współdzielony, więc nie mogę zmodyfikować session.gc_maxlifetime. Myślę o używaniu bazy danych do przechowywania sesji i kontrolowania czasu życia każdej sesji niezależnie (przy użyciu opcji zapamiętaj mnie). – Songo

+0

Dzięki za wyjaśnienie. Sprawiłeś że jestem szczęśliwy :) – Songo

1
  1. Prawidłowe, session.gc_maxlifetime usunie plik sesji, gdy sesja wygasa
  2. session_destroy nie usunąć plik sesji
  3. Tak, to jedyny sposób. Po wyłączeniu zbierania śmieci przy użyciu session.gc_divider i zrobienia skryptu do tworzenia własnego garbage collection, dystrybucja oparta na Debianie faktycznie robi to domyślnie.

Przechowywanie sesji w niektórych bazach danych nie zmieni tych reguł.

+0

Dziękuję za odpowiedź. Nie mam żadnej kontroli nad php.ini, ponieważ jest to serwer współdzielony, więc nie mogę zmodyfikować session.gc_maxlifetime. Zastanawiam się, czy użyć bazy danych do przechowywania sesji i kontrolować czas życia każdej sesji niezależnie (przy użyciu opcji zapamiętaj mnie). Czy to możliwe? – Songo

+1

Tak, to jest wykonalne. – RageZ

+0

Wszelkie samouczki lub przykłady naprawdę pomogłyby :). W rzeczywistości używam Zend Framework, więc przechowywanie sesji w bazie danych jest łatwe. Problem polega na tym, że nie ma nic wspominanego o przedłużaniu niezależnego czasu życia sesji. Sądziłem, że funkcja rememberMe() będzie działać, ale wydłuży to tylko czas działania pliku cookie. – Songo

Powiązane problemy