Jednym z bardziej oczywistych sposobów na obsługę sytemu autoryzacji w PHP jest korzystanie ze zmiennych sesyjnych. Jest to w miarę proste i eleganckie rozwiązanie. Schody zaczynają się jednak w momencie, gdy liczba użytkowników rozbudowanego serwisu zwiększa się do tak dużej liczby, że dane utrzymywane w zmiennych sesyjnych będą zajmować maksymalne ilości pamięci zapisane w konfiguracji serwera. W takich sytuacjach długość trwania sesji ulegnie drastycznemu skróceniu a użytkownicy będą notorycznie wylogowywani z serwisu.
Wyczerpywanie limitu pamięci spowoduje, że zwiększanie wartości session.gc_maxlifetime
w ini_set nie będzie dawało żadnych wymiernych korzyści. Garbage collection
i tak notorycznie będzie niszczył najstarsze nieaktywne sesje. Ciągła rotacja powracających wylogowanych użytkowników będzie powodowała krótkie trwanie pozostałych sesji.
W niektórych przypadkach można dokonać optymalizacji kodu źródłowego witryny, przez rezygnację z utrzymywania niektórych danych jako zmienne sesyjne. Będzie to jednak dosyć trudne do wykonania w przypadku obszernych istniejących już projektów. W takich przypadkach modyfikacja kodu będzie pracochłonna
Oczywiście można zwiększyć zasoby fizyczne serwera, lub też zmienić jego konfigurację. Jest to możliwe jedynie w sytuacjach, gdy masz pełną kontrolę nad serwerem. W większości wypadków, rozpatrując typowy hosting, rozwiązania te nie są możliwe do wykonania. W takich sytuacjach najlepszym i najprostszym sposobem będzie przeniesienie zawartości sesji z pamięci serwera do plików.
Wykonanie tej operacji jest stosunkowo proste. Można to zrobić na kilka sposobów. Dwa najprostsze to:
umieszczenie w kodzie PHP następującego polecenia:
session_save_path('/sciezka/nazwa_katalogu');
lub umieszczenie w pliku .htaccess następującego wpisu:
php_value session.save_path /sciezka/nazwa_katalogu/
Same zmiany po stronie użytkownika witryny nie będą zauważalne (oczywistym poza wydłużeniem trwania sesji). Dodatkowymi korzyściami jakie możesz wyciągnąć z tych zmian to kontrola nad zalogowanymi użytkownikami. W katalogu, który przeznaczyłeś do przechowywania zawartości sesji, znajdziesz pliki, których nazwy wyglądają mniej więcej w ten sposób:
sess_004a0196f6d57c622454e5f0cb19678b
Część nazwy pliku po znaku „_” to identyfikator sesji. We wnętrzu pliku znajdziesz zserializowaną zawartość tej sesji. Dzięki w miarę prostej aplikacji napisanej w PHP można zbudować raport, który pozwoli na sprawdzenie którzy użytkownicy mają aktywne sesje, oraz podejrzenie zawartości ich sesji. Skasowanie pliku sesji jest równoznaczne z wylogowaniem użytkownika z witryny (zniszczeniem jego sesji). Pozwala to w łatwy sposób wylogować, pojedynczego użytkownika, grupę lub wszystkich użytkowników danego serwisu.
Dzięki znajomości identyfikatora sesji użytkownika możliwe jest również wykonanie operacji podszycia się pod dane zalogowane konto. Wystarczy skorzystać choćby z firefoxa wzbogaconego o dodatek firebug, który pozwala edytować wartości przechowywanych w cookies. Ta korzyść to jednak bardziej ciekawostka niż przydatna właściwość (być może jednak są osoby które skorzystają z tej opcji).
Osobiście korzystam z utrzymywania sesji w plikach, od ponad roku i jak na razie nie spotkałem się z sytuacją, aby rozwiązanie to miało jakiś niekorzystny wpływ na działanie serwisu. Od tamtej pory nie spotkałem się z uwagami co do działania sesji oraz długości ich trwania. Sesje trwają dokładnie tyle na ile ustawiony jest parametr session.gc_maxlifetime. Z czystym sumieniem mogę polecić to rozwiązanie :).
Znaczniki: PHP, programowanie, session