XLIX. Funkcje zarz▒dzania sesj▒
Obs│uga sesji w jΩzyku PHP to spos≤b na przechowywanie danych definiowanych podczas odwiedzin witryny przez u┐ytkownika.
Wsparcie dla sesji w PHP4 jest zbli┐one do zarz▒dzania sesj▒ u┐ytym w PHPLIB.
U┐ytkownikowi odwiedzaj▒cemu witrynΩ zostaje przyznany unikalny identyfikator zwany identyfikatorem sesji (session id). Jest on zapisywany w cookie i wysy│any do u┐ytkownika lub umieszczany w URL'u.
Obs│uga sesji umo┐liwia rejestrowanie wielu danych (zmiennych) pozyskiwanych z zapyta± HTTP . Kiedy wizytuj▒cy odwiedza witrynΩ, PHP automatycznie (je┐eli session.auto_start ma warto╢µ 1) lub gdy tego za┐▒dasz (wywo│uj▒c funkcjΩ session_start() lub session_register()) sprawdza czy w zapytaniu zosta│ umieszczony identyfikator sesji. Je╢li jest, to poprzednie zmienne zostaj▒ zast▒pione nowymi zawartymi w zapytaniu.
Wszystkie zarejestrowane zmienne s▒ zapisywane w sesji. Zarejestrowane zmienne kt≤re nie zosta│y zdefiniowane s▒ zaznaczane jako niezdefiniowane. Przy kolejnych odwiedzinach zmienne te utrzymuj▒ swoj▒ warto╢µ, chyba ┐e u┐ytkownik zdefiniuje inn▒ warto╢µ podczas kolejnych wizyt.
- Opcje konfiguracji track_vars i gpc_globals maj▒ wp│yw na spos≤b przywracania zmiennych sesji. Je╢li w│▒czona jest opcja track_vars, zmienne sesji po przywr≤ceniu bΩd▒ dostΩpne w globalnej tablicy $HTTP_STATE_VARS. Je╢li w│▒czona jest opcja gpc_globals, zmienne po przywr≤ceniu sesji bΩd▒ dostΩpne jako zmienne globalne. Je╢li obie opcje s▒ w│▒czone, to zar≤wno zmienne globalne jak i tablica $HTTP_STATE_VARS zawieraj▒ te same warto╢ci.
Istniej▒ dwie metody rozpowszechniania identyfikatora sesji:
Modu│ sesji wspiera obydwie metody. Cookies to metoda optymalna, ale nie jest pewna (klient (przegl▒darka) mo┐e nie akceptowaµ cookie), wiΩc nie mo┐emy na niej polegaµ. Drugi spos≤b to umieszczanie identyfikator≤w bezpo╢rednio w URL'ach. MetodΩ tΩ PHP obs│uguje w spos≤b przezroczysty je┐eli zosta│o skompilowane z opcj▒ --enable-trans-sid i zmienia ka┐dy wzglΩdny URI tak aby automatycznie zawiera│ identyfikator sesji. WzglΩdnie, mo┐esz u┐yµ sta│ego, wcze╢niej okre╢lonego SID, je┐eli klient nie przys│a│ poprawnego cookie (wa┐nego SID). SID ma postaµ session_name=session_id lub jest pustym │a±cuchem znak≤w.
Poni┐szy przyk│ad demonstruje rejestrowanie zmiennej i spos≤b stosowania SID'a w odno╢niku.
Przyk│ad 1. Zliczanie liczby odwiedzin dla pojedy±czego u┐ytkownika
<?php
session_register("licznik");
$licznik++;
?>
Witaj, nasza witryne odwiedziles juz <? echo $licznik; ?> razy.<p>
<?
# <?=SID?> jest konieczny do przechowania identyfikatora sesji
# je╢li u┐ytkownik nie u┐ywa cookies
?>
Aby kontynuowac, <A HREF="nastepna.php?<?=SID?>">kliknij !</A>
Aby przechowywaµ sesje w bazie danych potrzebna bΩdzie funkcja session_set_save_handler(). Aby u┐ywaµ wspomnianej funkcji do obs│ugi bazy MySql lub innej powiniene╢ rozbudowaµ nastΩpuj▒ce funkcje.
Przyk│ad 2. U┐ycie session_set_save_handler()
<?php
function open ($save_path, $session_name) {
echo "open ($save_path, $session_name)\n";
return true;
}
function close () {
echo "close\n";
return true;
}
function read ($key) {
echo "write ($key, $val)\n";
return "foo|i:1;";
}
function write ($key, $val) {
echo "write ($key, $val)\n";
return true;
}
function destroy ($key)
return true;
}
function gc ($maxlifetime) {
return true;
}
session_set_save_handler ("open", "close", "read", "write", "destroy", "gc");
session_start ();
$foo++;
?>
Powy┐szy przyk│ad wygeneruje poni┐sze:
$ ./php save_handler.php
Content-Type: text/html
Set-cookie: PHPSESSID=f08b925af0ecb52bdd2de97d95cdbe6b
open (/tmp, PHPSESSID)
read (f08b925af0ecb52bdd2de97d95cdbe6b)
write (f08b925af0ecb52bdd2de97d95cdbe6b, foo|i:2;)
close
<?=SID?> nie jest konieczny, je╢li PHP zosta│o skompliowane z opcj▒ --enable-trans-sid (w│▒czony transparent session ID).
System zarz▒dzania sesj▒ jest konfigurowany wieloma opcjami umieszczonymi w php.ini. Oto ich kr≤tki przegl▒d:
- session.save_handler definiuje nazwΩ uchwytu, kt≤ry bΩdzie u┐ywany do zapisu i odczytu danych skojarzonych z sesj▒. Domy╢lnie s▒ to pliki.
- session.save_path definiuje argument, kt≤ry jest przesy│any do uchwytu aby go zapisaµ. Je╢li wybierzesz domy╢lny uchwyt plikowy, argumentem jest ╢cie┐ka katalogu gdzie bΩd▒ umieszczane pliki. Domy╢lnie /tmp.
- session.name okre╢la nazwΩ sesji, kt≤ra jest u┐yta jako nazwa cookie. Nazwa powinna zawieraµ tylko znaki alfanumeryczne. Domy╢lnie PHPSESSID.
- session.auto_start okre╢la czy modu│ sesji uruchamia automatycznie sesjΩ w chwili nadej╢cia zapytania. Domy╢lnie 0 (wy│▒czone).
- session.lifetime okre╢la czas "┐ycia" cookie (w sekundach) przesy│anej do przegl▒darki. Warto╢µ 0 oznacza "do zamkniΩcia okna przegl▒darki". Domy╢lnie 0.
- session.serialize_handler definiuje nazwΩ uchwytu, kt≤ry jest u┐ywany do szeregowania danych. Obecnie wspierany jest wewnΩtrzny format PHP (nazwa: php) i WDDX (nazwa: wddx). WDDX jest dostΩpne tylko je╢li PHP jest skompilowane ze wsparciem dla WDDX. Domy╢lnie php.
- session.gc_probability okre╢la prawdopodobie±stwo (w %), ┐e procedury czyszczenia starych sesji (garbage collection) startuj▒ przy ka┐dym zapytaniu. Domy╢lnie 1.
- session.gc_maxlifetime okre╢la liczbΩ sekund po kt≤rych dane bΩd▒ uznane jako "╢mieci" i zostan▒ usuniΩte.
- session.extern_referer_check okre╢la czy identyfikatory sesji odebrane z zewnΩtrznych witryn maj▒ byµ usuniΩte. Je┐eli identyfikatory sesji s▒ umieszczane w URL, u┐ytkownicy nie znaj▒cy zasady dzia│ania tej metody, mog▒ nie╢wiadomie rozpowszechniaµ sw≤j session id, co prowadzi do problem≤w z bezpiecze±stwem. Domy╢lnie 0 (wy│▒czone).
- session.entropy_file zawiera ╢cie┐kΩ do zewnΩtrznych zasob≤w (pliku), kt≤ry bΩdzie dodatkowo wykorzystywany w procesie tworzenia identyfikatora sesji. Przyk│ady: /dev/random lub /dev/urandom kt≤re s▒ dostΩpne w systemach Unix.
- session.entropy_length okre╢la liczbΩ bajt≤w, kt≤re bΩd▒ odczytywane z pliku okre╢lonego wy┐ej (session.entropy_file). Domy╢lnie 0 (wy│▒czone).
- session.use_cookies okre╢la, czy modu│ sesji bΩdzie u┐ywa│ cookie do zapisywania identyfikatora sesji po stronie klienta. Domy╢lnie 1 (w│▒czone).
Uwaga: Obs│uga sesji zosta│a dodana w PHP 4.0.
session_start
session_start - inicjuje sesjΩ
Opis
bool session_start(void);
session_start() tworzy sesjΩ (lub reasumuje wcze╢niejsz▒, bazuj▒c na identyfikatorze sesji przes│anym jako zmienna w zapytaniu GET lub w cookie).
Ta funkcja zawsze zwraca true.
Uwaga: Funkcja zosta│a dodana w PHP 4.0.
session_destroy
session_destroy - niszczy wszystkie dane zarejestrowane w sesji
Opis
bool session_destroy(void);
session_destroy() niszczy wszystkie dane nale┐▒ce do aktualnej sesji. Ta funkcja zawsze zwraca true.
Uwaga: Funkcja zosta│a dodana w PHP 4.0.
session_name
session_name - pobiera i/lub ustawia nazwΩ aktualnej sesji
Opis
string session_name(string [nazwa]);
session_name() zwraca nazwΩ bie┐▒cej sesji. Je┐eli nazwa jest ju┐ okre╢lona, to nazwa bie┐▒cej sesji jest zmieniana na tΩ warto╢µ.
Nazwa sesji odpowiada identyfikatorowi sesji zamieszczonemu w cookies czy URL'u. Nazwa powinna zawieraµ tylko znaki alfanumeryczne; powinna byµ kr≤tka i opisowa (np. dla u┐ytkownik≤w z w│▒czonym powiadamianiem o nadej╢ciu cookie). Nazwa sesji jest zmieniana na warto╢µ domy╢ln▒ zapisan▒ w session.name podczas startu zapytania. W ten spos≤b, musisz wywo│aµ funkcjΩ session_name() dla ka┐dego zapytania (przed wywo│aniem session_start() lub session_register()).
Przyk│ad 1. Session_name()
<?php
# ustawia nazwΩ sesji na WebsiteID
$previous_name = session_name("WebsiteID");
echo "Poprzednia nazwa sesji to $previous_name<p>";
Uwaga: Funkcja zosta│a dodana w PHP 4.0.
session_module_name
session_module_name - pobiera i/lub ustawia bie┐▒cy modu│ sesji
Opis
string session_module_name(string [modu│]);
session_module_name() zwraca nazwΩ aktualnego modu│u sesji. Je┐eli modu│ jest ju┐ okre╢lony, w jego miejsce u┐ywany jest modu│ tu podany.
Uwaga: Funkcja zosta│a dodana w PHP 4.0.
session_save_path
session_save_path - pobiera i/lub ustawia ╢cie┐kΩ zapisu aktualnej sesji
Opis
string session_save_path(string [╢cie┐ka]);
session_save_path() zwraca ╢cie┐kΩ do katalogu u┐ywanego do zapisu danych sesji. Je┐eli ╢cie┐ka jest ju┐ okre╢lona, zostaje zast▒piona ╢cie┐k▒ tu zdefiniowan▒.
Uwaga: na niekt≤rych systemach mo┐esz podaµ ╢cie┐kΩ do systemu plik≤w, kt≤ry lepiej obs│uguje ma│e pliki, np. w Linuxie, system plik≤w reiserfs mo┐e byµ bardziej wydajny ni┐ zwyk│y ext2fs.
Uwaga: Funkcja zosta│a dodana w PHP 4.0.
session_id
session_id - pobiera i/lub ustawia aktualny identyfikator sesji
Opis
string session_id(string [id]);
session_id() zwraca identyfikator dla aktualnej sesji. Je┐eli id jest ju┐ okre╢lony, zostanie zast▒piony tu zdefiniowanym.
Uwaga: Funkcja zosta│a dodana w PHP 4.0.
session_register
session_register - rejestruje (zapisuje) jedn▒ lub wiΩcej zmiennych w bie┐▒cej sesji
Opis
bool session_register(mixed name, mixed [...]);
session_register() rejestruje zmienn▒ liczbΩ argument≤w, z kt≤rych ka┐dy mo┐e zawieraµ nazwΩ zmiennej (nie sam▒ zmienn▒) lub tablicΩ zawieraj▒c▒ nazwy zmiennych lub inne tablice . Dla ka┐dej zmiennej, session_register() rejestruje (zapisuje) nazwΩ zmiennej w bie┐▒cej sesji.
Funkcja zwraca true je╢li zmienna zostanie pomy╢lnie zarejestrowana w sesji (np. zapisana w pliku sesji).
Uwaga: Funkcja zosta│a dodana w PHP 4.0.
session_unregister
session_unregister - usuwa zmienn▒ z bie┐▒cej sesji
Opis
bool session_unregister(string nazwa);
session_unregister() usuwa zmienn▒ nazwa z bie┐▒cej sesji.
Funkcja zwraca true je╢li zmienna zostanie pomy╢lnie usuniΩta z sesji.
Uwaga: Funkcja zosta│a dodana w PHP 4.0.
session_is_registered
session_is_registered - sprawdza czy zmienna jest ju┐ zarejestrowana w sesji
Opis
bool session_is_registered(string nazwa);
session_is_registered() zwraca true je╢li zmienna o nazwie nazwa jest ju┐ zarejestrowana w bie┐▒cej sesji
Uwaga: Funkcja zosta│a dodana w PHP 4.0.
session_decode
session_decode - dekoduje dane sesji z │a±cucha znak≤w (string)
Opis
bool session_decode(string dane);
session_decode() dekoduje dane sesji zapisane w stringu dane, ustawiaj▒c zmienne w sesji.
Uwaga: Funkcja zosta│a dodana w PHP 4.0.
session_encode
session_encode - koduje dane bie┐▒cej sesji do postaci │a±cucha znak≤w (string)
Opis
bool session_encode(void);
session_encode() zwraca │a±cuch znak≤w (string) z zawarto╢ci▒ (danymi) bie┐▒cej sesji
Uwaga: Funkcja zosta│a dodana w PHP 4.0.
hm 2000
|