autor: Hubert Mierzwiak
Druga czê¶æ artyku³u opisuj±cego mechanizmy zarz±dzania sesj± z poziomu jêzyka PHP.
Modu³y przechowywania danych
Do odczytu i zapisu danych sesji, PHP u¿ywa modu³ów przechowywania danych. Obecnie s± dostêpne trzy modu³y:
- plikowy. domy¶lny, PHP zapisuje dane sesji na dysku (domy¶lnie w katalogu /tmp w Unix), tworz±c pliki tekstowe o nazwach identycznych jak identyfikatory sesji.
- mm. Je¶li potrzebujesz wiêkszej wydajno¶ci, modu³ mm daje Ci takie mo¿liwo¶ci. Dane sesji s± zapisywane w pamiêci dzielonej.
- u¿ytkownika. U¿ywany wewnêtrznie do realizacji odwo³añ do funkcji, które zdefiniowano w session_set_save_handler().
Prawdziwa moc tkwi w module u¿ytkownika, poniewa¿ umo¿liwia pisanie w³asnych funkcji do obs³ugi sesji, które wci±¿ bêd± bazowaæ na ujednoliconym API jêzyka PHP; mo¿esz zapisywaæ sesje jak chcesz i gdzie chcesz; w bazie danych np. MySql, plikach XML, DBF, na zdalnym serwerze FTP.
Aby skonfigurowaæ uchwyt do zapisu sesji bêdziemy potrzebowaæ funkcji session_set_save_handler(), która korzysta z sze¶ciu argumentów (³añcuchów znakowych) które musz± byæ wywo³aniami funkcji.
Sk³adnia funkcji jest nastêpuj±ca:
void session_set_save_handler(string open, string close, string read, string write, string destroy, string gc);
Uwaga: Aby opu¶ciæ jeden z argumentów, wstaw pusty string ("") do session_set_save_handler().
Funkcje s± definiowane nastêpuj±co:
bool open (string save_path, string sess_name);
Funkcja jest wywo³ywana podczas inicjalizacji sesji; powiniene¶ jej u¿yæ do przygotowania swoich funkcji, do inicjalizacji zmiennych itp. Funkcja pobiera dwa argumenty. Pierwszy to ¶cie¿ka gdzie sesja powinna byæ zapisana. Ta zmienna mo¿e byæ okre¶lona w php.ini lub przez funkcjê session_save_path().Drugi argument to nazwa sesji, domy¶lnie PHPSESSID. Funkcja zwraca true je¶li jej wykonanie siê powiedzie (istnieje ¶cie¿ka i nazwa sesji), lub false przy b³êdzie.
bool close ();
Ta funkcja jest wykonywana przy zamykaniu sesji. U¿ywana do zwalniania pamiêci lub kasowania zmiennych. Nie pobiera argumentów i zwraca true po zamkniêciu sesji lub false gdy nast±pi b³±d.
mixed read (string sess_id, );
Ta wa¿na funkcja jest wywo³ywana za ka¿dym razem gdy uruchamiana jest sesja. Musi ona odczytaæ dane z sesji identyfikowanej przez sess_id a zwraca uszeregowany ³añcuch znaków (string). Je¶li nie istnieje sesja z podanym ID, zwracany jest pusty ³añcuch. Je¶li podczas wywo³ania tej funkcji wyst±pi b³±d zwracane jest false.
bool write (string sess_id, , string value);
Ta funkcja jest wywo³ywana w momencie gdy sesjê nale¿y zapisaæ. Pierwszy argument to session ID; drugi to uszeregowane zmienne sesji. Funkcja zwraca true je¶li siê zapis siê powiedzie, w innym przypadku false.
bool destroy (string sess_id, );
Ta funkcja jest wywo³ywana gdy u¿ywamy funkcji session_destroy() w kodzie PHP. Kasuje ona wszystkie dane zwi±zane z podanym sess_id i zwraca true gdy kasowanie siê powiedzie lub false gdy wyst±pi b³±d.
bool gc (int max_lifetime, );
Ta funkcja jest wywo³ywana je¶li sesja startuje z okre¶lonym parametrem gc_probability. S³u¿y ona usuwaniu starych sesji; usuwa sesje które nie zosta³y uaktualnione w ci±gu gc_maxlifetime sekund. Zwraca true lub false.
Je¶li chcieliby¶my skonfigurowaæ nasz w³asny modu³ przechowywania sesji, za³ó¿my w bazie MySql, musimy dostarczyæ PHP implementacji podobnych funkcji. Prototypy takich funkcji powinny wygl±daæ mniej wiêcej tak:
function sess_open($save_path, $sess_name)
{
}
function sess_read($sess_id)
{
}
function sess_write($sess_id, $val)
{
}
function sess_destroy($sess_id)
{
}
function sess_gc($max_lifetime)
{
}
Aby zarejestrowaæ te funkcje musimy u¿yæ session_set_save_handler():
session_set_save_handler("sess_open", "", "sess_read", "sess_write", "sess_destroy", "sess_gc");
Przekazywanie identyfikatora sesji
PHP4 wspiera nastêpuj±ce metody przekazywania identyfikatora sesji:
- Cookies (domy¶lnie)
- GET/POST
- Umieszczanie session ID w URL'u (rêcznie/automatyczne)
Cookie s± domy¶lnym sposobem przekazywania identyfikatora sesji pomiêdzy stronami. Innym sposobem przekazywania ID s± metody GET/POST. Twój URL wygl±da wtedy tak: script.php?<session-name>=<session-id>. Mo¿esz tworzyæ podobne URL u¿ywaj±c globalnego, sta³ego SID:
printf('<a href="script.php?%s">Link</a>', SID);
Automatyczne przepisywanie URL'a to jedna z nowych mo¿liwo¶ci PHP 4, pozwalaj±ca dodawaæ session ID do wszystkich linków na witrynie. Aby w³±czyæ tê mo¿liwo¶æ musimy skompilowaæ PHP z opcj± --enable-trans-id. Od tej chwili identyfikator sesji bêdzie dodawany do wszystkich URL'i do stron napisanych w PHP. Oczywi¶cie przepisywanie URL'a znacznie obci±¿a serwer. Cookie s± za¶ ustawiane tylko raz nie powoduj±c przepisywania URL'a.
Przyk³ady
Plik z opisanym poni¿ej przyk³adem znajduje siê pod adresem:
http://php.zone.pl/misc/sessions.zip
Przyk³ad zawiera prost± grê znanej pod nazw± wisielec, na której mo¿na pokazaæ przechowywanie zmiennych. Podczas gry komputer wybiera przypadkowe piêcioliterowe s³owo, a graj±cy musi je odgadn±æ litera po literze. Graj±cy ma tylko sze¶æ prób po których je¶li nie odgadnie has³a wisielec zawisa na szubienicy. S³owa do odgadniêcia znajduj± siê w pliku words.txt i mog± zawieraæ dowolne wyrazy. Pamiêtaj, ¿e ka¿dy wyraz musi znajdowaæ siê w oddzielnej linii. Oczywi¶cie, gra nie mo¿e dzia³aæ bez przechowywania informacji o swoim stanie. Gracz nie mog³by wygraæ je¶li nie odgad³by ca³ego s³owa przy pierwszej próbie. Aby gra mog³a poprawnie dzia³aæ, potrzebujemy trzech zmiennych, które pamiêtaj± warto¶ci zmiennych pomiêdzy kolejnymi zapytaniami.
S± to:
. s³owo, które gracz próbuje zgadn±æ.
. litery, które gracz ju¿ poda³.
. ilo¶æ prób zakoñczonych nie odgadniêciem s³owa.
Przyk³ad u¿ywa domy¶lnej metody przekazywania identyfikatora sesji czyli cookie, za¶ zasada dzia³ania wygl±da tak:
. rejestrowane s± trzy zmienne.
. skrypt sprawdza czy formularz zosta³ wys³any metod± Post, co oznacza, ¿e gracz poda³ jaki¶ znak.
. je¶li tak, skrypt przyjmuje nowy znak, uaktualnia stan gry (wygra³e¶, przegra³e¶, pasuj±ca litera, nie pasuj±ca litera) i wy¶wietla odpowiedni komunikat.
. je¶li nie, uruchamiana jest nowa gra, pobierane jest przypadkowe s³owo z pliku words.txt.
. ³añcuch, który ukrywa jeszcze nie odgadniête litery w szukanym s³owie jest tworzony i wy¶wietlany w przegl±darce.
. reszta strony pozostaje bez zmian.
Wygl±d strony HTML jest konfigurowany przez oddzieln± klasê. W ten sposób oddzielamy kod programu od opisu wygl±du.
na podstawie:
"Session Handling with PHP 4.0" Tobias Ratschiller
|