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
|