autor: Hubert Mierzwiak
Pierwsza czΩ╢µ artyku│u opisuj▒cego mechanizmy zarz▒dzania sesj▒ z poziomu jΩzyka PHP.
WstΩp
W przeciwie±stwie do PHP 3, PHP 4.0 posiada zdolno╢µ zarz▒dzania sesjami u┐ytkownik≤w. Sesje pozwalaj▒ w prosty spos≤b ╢ledziµ poczynania poszczeg≤lnych u┐ytkownik≤w podczas kolejnych wizyt na naszej witrynie. Dla po│▒czenia danych sesji z u┐ytkownikiem, kt≤ry je wytworzy│ generowany jest identyfikator sesji (session ID), klucz │▒cz▒cy u┐ytkownika z jego danymi.
PHP 4.0 posiada wbudowan▒ podstawow▒ obs│ugΩ sesji, kt≤ra uwalnia nas od procesu tworzenia identyfikatora sesji, szeregowania i zapisu danych sesji, brakuje jednak tu kilku rozbudowanych mo┐liwo╢ci dostΩpnych w PHPLib.
Podstawowe terminy
Zarz▒dzanie sesjami to mechanizm utrzymuj▒cy informacje (dane) z serii zapyta± HTTP (wizyt) od tego samego u┐ytkownika na przestrzeni pewnego czasu. Termin "sesja" okre╢la tu czas jaki u┐ytkownik spΩdzi│ na konkretnej witrynie. Niestety w protokole HTTP brak jest mechanizm≤w inforuj▒cych o stanie po│▒czenia. Pojedy±cze zapytania HTTP nie musz▒ byµ ze sob▒ powi▒zane. Serwer www nie potrafi rozr≤┐niaµ kolejnych u┐ytkownik≤w, nie wie nic o sesjach konkretnych u┐ytkownik≤w. Zarz▒dzanie sesjami to spos≤b na po│▒czenie danych z u┐ytkownikiem podczas wizyty na witrynie. W artykule stosujΩ termin "sesja" dla okre╢lenia pojedy±czej wizyty u┐ytkownika na witrynie. Dla przyk│adu, typowa sesja online zwi▒zana z zakupami zawiera zalogowanie siΩ, pobranie artyku│≤w do koszyka, z│o┐enie zam≤wienia, podanie adresu (ew. numeru karty kredytowej), wys│anie zam≤wienia, i zamkniΩcie okna przegl▒darki (wylogowanie).
PHP 4.0 zawiera podstawowe funkcje do zarz▒dzania sesjami u┐ytkownik≤w.
Czas kiedy sesja jest aktywna okre╢lany jest "┐yciem" sesji.
"Szeregowanie" (serializing) oznacza przekszta│canie zmiennych do formatu kiedy mog▒ byµ zapisane jako normalny │a±cuch znak≤w (string). Bez mo┐liwo╢ci przekszta│cania zmiennych, nie mo┐liwe by│oby, np. zapisanie tablicy PHP w bazie danych. Szeregowanie danych jest pomocne przy przechowywaniu danych pomiΩdzy kolejnymi wizytami. Mo┐esz u┐ywaµ funkcji serialize() i deserialize(), choµ w PHP3 funkcje te nie pracuj▒ w│a╢ciwie na obiektach (klasach).
Podstawowe informacje
Bibilioteka zarz▒dzania sesj▒ u┐yta w PHP oferuje mo┐liwo╢ci jakie udostΩpnia wiΩkszo╢µ bibliotek zarz▒dzania sesj▒:
. Zapisuje dane sesji na serwerze. DziΩki temu, ┐e biblioteka u┐ywa r≤┐nych modu│≤w magazynowania danych, mo┐liwe jest przechowywanie danych w plikach tekstowych, pamiΩci dzielonej, czy bazie danych. Dok│adna lokalizacja danych nie jest wa┐na, je┐eli nie cierpi na tym wydajno╢µ.
. U┐ywa kodowanego, przypadkowego identyfikatora sesji dla identyfikacji u┐ytkownika.
. Zapisuje identyfikator sesji (i tylko identyfikator) po stronie klienta u┐ywaj▒c cookies, GET/POST, lub w ╢cie┐ce do skryptu.
. Je┐eli u┐ytkownik nie obs│uguje cookies, aplikacja mo┐e u┐ywaµ innego sposobu obs│ugi sesji.
Uruchamianie sesji
W PHP 4 uruchamianie sesji nastΩpuje po jawnym wywo│aniu funkcji session_start(), lub automatycznie przy rejestrowaniu zmiennej w sesji u┐ywaj▒c session_register(). Zwykle wywo│uje siΩ funkcjΩ session_start() na pocz▒tku strony (skryptu), tak aby zmienne sesji by│y dostΩpne w skrypcie. Nie ma jednak ┐adnej r≤┐nicy, je┐eli rejestrujesz zmienne sesji wywo│uj▒c funkcjΩ session_register() na pocz▒tku skryptu i pomijasz wywo│anie session_start(), poniewa┐ wywo│uj▒c session_register() automatycznie (wewnΩtrznie) jest uruchamiana funkcja session_start() , je┐eli sesja jeszcze nie zosta│a uruchomiona.
Z chwil▒ uruchomienia sesji:
. PHP sprawdza czy istnieje wa┐ny identyfikator sesji (session ID)
. Je┐eli nie istnieje wa┐ny identyfikator sesji, PHP tworzy nowy identyfikator
. Je┐eli istnieje wa┐ny identyfikator sesji, zamro┐one zmienne tej sesji s▒ reaktywowane i wprowadzane z powrotem do globalnej przestrzeni zmiennych.
Rejestrowanie zmiennych sesji jest wykonywane komend▒ session_register(). Umo┐liwia ona tworzenie (rejestrowanie) zmiennych, kt≤re s▒ przechowywane przez sesjΩ i dostΩpne podczas sesji. Wszystkie zmienne, kt≤re chcesz przechowywaµ na potrzeby kolejnych wizyt u┐ytkownika na witrynie musz▒ byµ zarejestrowane funkcj▒ session_register(). Argumentem tej funkcji jest nazwa zmiennej, nie sama zmienna ! Aby usun▒µ zmienn▒ z sesji mo┐esz u┐yµ funkcji session_unregister() np. w przypadku, gdy u┐ytkownik usuwa produkt z koszyka.
Przyk│ad: prosty licznik.
. startujemy sesjΩ
. wy╢wietlamy ostatni▒ warto╢µ licznika
. zwiΩkszamy licznik
. rejestrujemy licznik
session_start();
print($licznik);
$licznik++;
session_register("licznik");
Oczywi╢cie licznik ten zlicza odwiedziny tylko jednego u┐ytkownika, bazuj▒c na zmiennej zawartej w jego sesji. Domy╢lna konfiguracja PHP okre╢la czas ┐ycia cookie do momentu zamkniΩcia okna przegl▒darki (lifetime = 0), wiΩc je╢li zamkniesz okno przegl▒darki i ponownie je otworzysz licznik zwiΩkszy siΩ zn≤w o 1.
Przyk│ad: rejestrowanie zmiennej $imie
session_register("imie");
Przyk│ad: rejestrowanie wcze╢niej zdefiniowanej zmiennej $ulica
$ulica = "Pomorska";
$foo = "ulica";
session_register($foo);
R≤┐nica w dw≤ch ostatnich przyk│adach polega na tym, ┐e w pierwszym, zmienna "imie" jest rejestrowana jako zmienna sesji, w drugim zmienna o nazwie "ulica". Funkcja session_register() pobiera jako argument nazwΩ zmiennej, a nie sam▒ zmienn▒ !
úatwo╢µ pos│ugiwania siΩ zmiennymi sesji mo┐na por≤wnaµ do pos│ugiwania siΩ zmiennymi zdefiniowanymi w metodach GET/POST. Je┐eli zarejestrujesz zmienn▒ o nazwie foo, to $foo jest dostΩpna automatycznie zaraz po wywo│aniu funkcji session_start(). Poniewa┐ funkcja serialize() w PHP4 posiada nowe mo┐liwo╢ci, realnym sta│o siΩ u┐ywanie obiekt≤w (klas) jako zmiennych sesji.
Uwaga: podczas uruchamiania sesji, mo┐e byµ stworzony nowy identyfikator sesji je┐eli sesja zostanie uznana za niewa┐n▒, poniewa┐ u┐ytkownik wchodzi na witrynΩ z nie lokalnej strony (nie ze strony na tej witrynie) je╢li opcja extern_referer_check (uwaga: pojedy±cze "r") jest w│▒czona w pliku konfiguracyjnym PHP. Jest to jedna z metod zapobieganiu wchodzenia u┐ytkownik≤w z innych witryn PHP i przejmowaniu sesji (jest to na razie ma│o prawdopodobne).
Zamykanie sesji
Sesja nie jest zamykana automatycznie, poniewa┐ systemowi trudno by│oby okre╢liµ kiedy u┐ytkownik ko±czy sesjΩ.
R≤┐ne komendy kontroluj▒ zako±czenie sesji przez u┐ytkownika.
. SesjΩ mo┐na zamkn▒µ funkcj▒ session_destroy().
. Je┐eli przekazujesz session ID poprzez cookies, pamiΩtaj, ┐e ich czas ┐ycia trwa do chwili zamkniΩcia okna przegl▒darki (lifetime = 0). Jednak mo┐esz okre╢liµ inny czas ┐ycia dla cookie wpisuj▒c odpowiedni▒ warto╢µ w pliku konfiguracyjnym PHP.
. Mo┐esz u┐yµ dyrektywy konfiguracyjnej gc_maxlifetime do okre╢lenia po jakim czasie od ostatniej sesji dane tej sesji maj▒ byµ skasowane, poniewa┐ serwer nie wie czy cookie wci▒┐ istnieje na komputerze u┐ytkownika. Jednak wykonywanie czyszczenia starych sesji (zwane "garbage collection") przy ka┐dym dostΩpie do strony mo┐e wp│ywaµ na wydajno╢µ, dlatego te┐ r≤wnocze╢nie z opcj▒ gc_maxlifetime, powiniene╢ u┐yµ opcji gc_probability , kt≤ra okre╢la z jakim prawdopodobie±stwem maj▒ byµ wywo│ywane procedury czyszczenia starych sesji. Je┐eli gc_probability wynosi 100, czyszczenie jest wykonywane podczas ka┐dego zapytania (tzn. z prawdopodobie±stwem 100%); je╢li wynosi 1 (domy╢lnie), stare sesje zostan▒ usuniΩte z prawdopodobie±stwem 1% dla ka┐dego zapytania.
Je╢li nie u┐ywamy cookie, ale przesy│amy identyfikator sesji za pomoc▒ metod GET/ POST, musimy zachowaµ szczeg≤ln▒ ostro┐no╢µ przy u┐ywaniu procedur czyszczenia sesji. U┐ytkownicy mog▒ umie╢ciµ URL ze swoim identyfikatorem w bookmarkach/ulubionych , w tym wypadku nale┐y wykonywaµ cykliczne czyszczenie sesji, poniewa┐ je╢li dane sesji istniej▒ kiedy u┐ytkownik ponownie wchodzi na stronΩ ze swoim identyfikatorem sesji, PHP reasumuje poprzedni▒ sesjΩ zamiast wystartowaµ now▒ sesjΩ. Warto╢µ gc_probability w zakresie 10-20 bΩdzie bardziej odpowiednia dla takiego scenariusza, ani┐eli warto╢µ 1 (czΩ╢ciej bΩd▒ czyszczone stare sesje) .
Mo┐e zastanawiaµ fakt, dlaczego PHP pozwala zdefiniowaµ prawdopodobie±stwo (gc_probability) okre╢laj▒ce kiedy maj▒ byµ czyszczone stare sesje, zamiast ustalenia czyszczenia co n wywo│a±. Je┐eli PHP u┐ywa│oby funkcji zliczaj▒cych, serwer musia│by kontrolowaµ ilo╢µ otwartych sesji. U┐ywaj▒c prawdopodobie±stwa serwer nie musi przechowywaµ licznik≤w otwartych sesji, przez co jest o wiele szybszy.
na podstawie:
"Session Handling with PHP 4.0" Tobias Ratschiller
|