PHP Session Cookie (ogólnie określane jako PHPSESSID) posiadają określony na serwerze "czas życia", lub istnieją do momentu zamknięcia okna przeglądarki. Sporym tematem do omówienia jest przestrzeń przechowywania tych danych na serwerze, w /tmp (katalogu tymczasowych plików).
Kiedy sesja jest utworzona, plik tekstowy jest tworzony na serwerze np. w katalogu /tmp na Linux serwerze. Od tego momentu ID sesji ma unikalny numer identyfikujący sesję, a pliki w /tmp są tam przechowywane przez zdefiniowany na serwerze czas - zawartość tego tymczasowego katalogu jest kasowana co pewien okres czasu.
PHP ma wbudowany mechanizm "load-balancingu" dla tego katalogu tymczasowego, tak więc stare pliki sesyjne nie są kasowane w czasie każdego żądania, ale często następuje to zgoła losowo.
Domyślny czas timeout dla plików sesyjnych to 1440 s lub 24 minuty. Tak więc pliki sesji mogą zostać usunięte po tym czasie, ale mogą też pozostawać na serwerze dłużej, zależnie od tego, kiedy są tworzone i wywoływane - tu mamy sporą losowość.
Tak więc mamy plik ciasteczka o określonym czasie życia sesji działający do czasu zamknięcia okna przeglądarki, ale w katalogu /tmp serwera mogą one zostać skasowane dużo wcześniej i doświadczamy wtedy niedogodności np. nagłego wylogowania. W takim przypadku, oraz jeśli pojawia się żądanie sesji po tym, jak plik sesji został skasowany, nowy plik sesji jest tworzony i stare info o sesji jest utracone. To może być często frustrujące - prowadzi do nieoczekiwanych zdarzeń w trakcie pracy na stronach.
Są 3 zmienne w PHP.ini, które ustalają, jak ma działać katalog /tmp naszej "śmietniczki" na serwerze - określane jako "Changeable":
- session.gc_maxlifetime 1440 seconds
- session.gc_probability 1
- session.gc_divisor 100
session.gc_probability w połączniu z session.gc_divisor jest stosowane do ustawienia prawdopodobieństwa zadziałania, gdzie procedura gc (garbage collection) się rozpoczyna.
Prawdopodobieństwo to jest obliczane jako gc_probability/gc_divisor, co np. 1/100 oznacza, że tam jest 1% szans na to, że "GC process" wystartuje w praktyce na każde żądanie.
Jedną z ważniejszych jest parametr zdefiniowany w session.gc_maxlifetime: Jak wspomniałem wcześniej, określa on czas timeout do skasowania tych plików sesji.
Problem pojawić się może, gdy mamy zwiększony ruch na stronie - Apache może zawiesić się z blokadą "file lock errors" (w folderze /tmp) i te pliki nie są wtedy kasowane.
PHP session są więc dość zawodne, tak więc takie Yahoo czy Facebook stosują własny mechanizm sesji i śledzenia użytkownika - stosują własny system stosując bazy DB lub Memcache dla przechowywania danych z session Ids.