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
|