Sunteți pe pagina 1din 4

Manipularea sesiunilor in PHP4

Introducere
Spre deosebire de PHP3, PHP4 are posibilitatea de a controla managementul sesiunilor intern, fara
alte biblioteci externe. Managementul sesiunilor din PHP 4 este simplu de folosit, puternic si deschis
pentru alte adaptari.
Prin sesiuni veti putea observa actiunile unui anumit user pe durata vizitei sale pe site-ul dvs.

Pentru a asocia informatiile sesiunii cu un anumit user, aveti nevoie de un numar de identificare a
sesiunii. Adica de o cheie ce il asociaza pe un anumit utilizator de informatiile sale. Acest tutorial
discuta cum se deschid sesiunile, cum urmarim informatiile un cursul unei sesiuni si cum sa stergem
sesiunile.
Cum ziceam mai devreme, PHP 4 are un puternic management intern al librariilor. Totusi, pentru un
mai mare control si o mai mare complexitate, e recomandabil sa folositi PHPLib ( un pachet pentru
PHP3, dar merge si pentru PHP4 ).
Scopurile tutorialului
In acest tutorial vom invata urmatoarele:
- Ce este o sesiune
- Cum sa folosim variabile persistente
- Cum numarul de identificare al sesiunilor ( sessionID ) este transmis de la o pagina la alta
- Cum sa sfirsim o sesiune si sa executam initializarea datelor.
- Cum sa folosim functiile de managementul sesiunilor din PHP4, incluzind aici:
o sess 19319f59t ion_register()
o sess 19319f59t ion_start()
o sess 19319f59t ion_destroy()
o gc_probability()
o gc_maxlifetime
o serialize()
o deserialize()
o sess 19319f59t ion_save_path()
- Cum stocheaza PHP-ul datele despre o sesiune
Termeni de baza
Managementul sesiunilor este un mecanism de a mentine informatii despre cererile unui utilizator dea lungul unei perioade de timp. Termenul "sesiune" se refera la perioada de timp pe care un utilizator
o petrece pe un anumit web site. Problema este ca protocolul HTTP nu are nici un mecanism pentru a
mentine aceasta perioada. De asmenea, server-ul web nu stie nimic despre sesiuni. Managementul
sesiunuilor se refera la modalitatea prin care informatii sint associate unui utilizator pe durata vizitei
sale pe o anumita pagina Web. Spre exemplu, un magazin on-line tipic va folosi sesiuni pentru
inregistrarea utilizatorilor ( login ), pentru a adauga bunuri in cosul de cumparare, pentru a introduce
informatii cum ar fi credit card-ul sau adresa la check-out, si pentru inchiderea ferestrei browserului.
"Viata" unei sesiuni se refera la timpul fizic in care o sesiune este activa. "Serializarea" inseamna
transformarea variablilelor intr-o forma binara de reprezentare ca poate fi inmagazinata oriunde ca un
string obisnuit. Fara posibilitatea serializarii nu ar fi posibil, spre exemplu, stocarea vectorilor PHP in
baze de date. Datele pot serializate prin functia serialize() sau deserializate prin deserialize(). In
PHP3 insa, aceste functii nu lucreaza corect cu obiecte.
Informatii de baza
Managementul sesiunilor in PHP 4 are citeva caracteristici cerute de o librarie de control al sesiunilor:
o Stocheaza date pe server. Deoarece libraria foloseste diferite module de stocare, puteti tine

informatiile in fisiere text, memorie sau baze de date.


o Foloseste o funtie criptografica aleatoare pentru a acrea un sessionID in scopul identificarii unice
a unui utilizator.
o Salveaza sessionID-ul ( si numai acesta ! ), pe calculatorul client, folosind cookie-uri, GET/POST
sau direct prin script ( Location ).
o Daca utilizatorul dezactiveaza cookie-urile, aplicatia dvs. va folosi alte metode pentru a propaga
sesiunea.
Initializarea unei sesiuni
O sesiune se porneste explicit in PHP4 prin session_start() sau implicit inregistrind o variabila pentru
sesiune utilizind session_register(). De obicei se cheama session_start() la inceputul paginii, pentru
ca variabilele sesiune sa fie disponibile scriptului dvs., si de abia dupa aceea veti inregistra
variabilele. Insa puteti si sa inregistrati variabilele sesiune prin session_register() la inceputul scriptului
si sa omiteti cu totul session_start(). Functia session_register() apeleaza intern session_start() in caz
ca sesiunea nu este pornita. Cind o sesiune este initializata, oricare ar fi varianta aleasa, se intimpla
urmatoarele:
o PHP-ul verifica daca exista un sessionID valid.
o Daca nu exista unul, PHP va crea un sessionID
o Daca exista un ID valid, variabilele respectivei sesiuni sint reactivate si reintroduse in cimpul
global al variabilelor.
Inregistrarea unei variabile sesiune se face prin comanda session_register(). Aceasta permite crearea
( inregistrarea ) unei variabile ce este pastrata pe intreaga durata a sesiunii. Orice variabila pe care
vreti sa o pastrati de-a lungul unei sesiuni trebuie neaparat inregistrata prin session-register().
Aceasta functie ia ca argument numele unei variabile si nu variabila insasi. Puteti folosi
session_unregister() pentru a sterge o variabila din cadrul sesiunii, spre exemplu cind un utilizator
scoate un produs din cosul de cumparaturi.
Exemplu de sintaxa : Acesta este un exemplu de contor.
o Initializarea unei sesiuni
o Afisarea celei mai recente valori a contorului
o Incrementarea contorului
o Inregistrarea contorului
session_start();
print($counter);
$counter++;
session_register("counter");
Bine inteles, acest exemplu difera de un contor normal: sesiunea ( si implicit contorul ) sint legate de
un anumit utilizator. Prin configurarea standard a PHP-ului, durata de viata a unui cookie este 0; asta
inseamna ca daca inchideti browser-ul si il redeschideti, contorul se va reseta, deoarece cookie-ul a
fost sters.
Exemplu : Inregistrarea variabilei $text
Session_register("text");
Exemplu : Inregistrarea unei variabile definite mai devreme
$var_text = "Acesta este un string";
$string = "var_text";
session_register($string);
Diferenta dintre cele doua exemple consta in faptul ca in prima, o variabila numita "text" este
inregistrata ca o variabila sesiune, in timp ce in al doilea exemplu o alta variabila numita "var_text".
Aceste exemple arata ca session_register() preia numele unei variabile ca argument si nu variabila
insasi.
Este la fel de usor de manipulat variabile sesiune ca si variabile tip GET/POST.

Terminarea unei sesiuni


Sfirsitul unei sesiuni nu este automatic, deoarece este dificil pentru system sa realizeze cind un user a
terminat o sesiune. Exista citeva comenzi care va ajuta sa controlati modul in care sistemul termina o
sesiune pentru un utilizator.
Puteti forta terminarea unei sesiuni prin session_destroy().
Daca propagati sessiunID prin cookie-uri, durata de viata standard a unui cookie este 0, ceea ce
inseamna ca sesiunea se va termina de indata de fereastra beowserului se inchide. Puteti influenta
durata de viata a cookie-ului prin configurarea duratei de viata.
Puteti utiliza directiva de configurarea gc_maxlifetime pentru a determina la ce perioada de timp
dupa ultimul acces, o sesiune sa fie distrusa. Acest procedeu este utilizat deoarece serverul nu stie
daca cookie-ul mai exista sau nu de partea client. Totusi, utilizind acest procedeu pentru a "curata"
sesiuni vechi pentu fiecare pagina ceruta poate cauza o incarcare foarte mare. De aceea, impreuna
cu gc_maxlifetime trebuie utilizat si gc_probability. Acesta specifica cu ce probabilitate rutina de
"curatare" a sesiunilor trebuie invocata. Daca gc_probability este de 100, atunci rutina va apelata la
fiecare cerere de pagina.
Daca nu folositi cookie-uri, ci transmiteti sessionID prin GET/POST, atunci trebuie sa aveti mare
atentie la rutinele de "curatare". Utilizatorii ar putea salva bookmark-uri ce contin sessionID, de aceea
este important ca rutina de curatare sa fie apelata destul de des.
Modalitati de stocare
Pentru a citi si salva datele sesiunii, PHP-ul foloseste module de stocare. Curent, sint 3 module de
stocare:
fisiere. In mod standard, PHP-ul foloseste acest modul pentru a salva datele unei sesiuni pe disc.
Creaza un fisier text, numit dupa sessionID, in directorul /tmp. In cazul unui contor, continutul acestui
fisier ar putea fi dat de reprezentarea serializata a uneu variabile: contor|i:4;
mm. Daca aveti nevoie de inalta performanta, modulul mm ofera o alternativa viabila; stocheza
datele in memorie.
user. Folosit intern pentru a realiza functii tip callback pe care le puteti defini cu
session_set_save_handler().
Adevarata putere este data de capacitatea unu utilizator de a defini functi callback ca module de
stocare. Deoarece puteti scrie propriile functii care sa manipuleze datele unei sesiuni, puteti stoca
sesiuni oriunde: in baze de date cum ar fi MySQL, in fisiere XML, sau chiar si pe un server FTP.
Functia session_set_save_handler() are sase argumente, ce trebuie sa fie functiile callback. Sintaxa
functiei este urmatoarea:
Void session_set_save_handler(string open, string close, string reads, string write, string
destroy, string gc);
Pentru a omite un argument, trasnmiteti functiei un string gol ("").
Functiile sint definite dupa cum urmeaza:
bool open ( string save_path, string sess_name);
Aceasta functie este executata la initializarea unei sesiuni; Are doua string-uri drept parametrii. Primul
este calea unde trebuie sa fie salvate sesiunile. Aceasta variabila poate sa fie setata si in php.ini , sau
prin session_set_path(). Al doilea este numele sesiunii, standard este PHPSESSID. Returneaza
adevarat in caz de suuces sau fals in caz de eroare.
bool close ();
Aceasta functie este executata la inchiderea unei sesiuni. Utilizati-o pentru a elibera memoria sau
pentru a distruge o variabila.
mixed read ( string sess_id) ;
Aceasta functie importanta este chemata de fiecare data cind o sesiune este pornita. Trebuie sa
citeasca datele unei sesiuni identificata prin sess_id si sa le intoarca serializate. Daca nu exista o

sesiune cu ID-ul respective, un string gol "", va fi returnat.


bool write (string sess_id , string value );
Cind o sesiune trebuie salvata, aceasta functie este executata. Primul argument este dat de ID-ul
sesiunii, al doilea este reprezentarea serializata a variabilelor.
bool destroy ( string sess_id );
Cind functia session_destroy() este apelata aceasta functie este executata. Ea distruge toate
informatiile associate sesiunii cu sess_id-ul respectiv.
bool gc ( int max_lifetime );
Aceasta functie este apelata la pornirea unei sesiuni cu probabilitatea specificata in gc_probability.
Este folosita in curatarea sesiunilor, respectiv pentru a sterge sesiuni ce nu au mai fost actualizate
pentru mai mult de gc_maxlifetime secunde.
Daca vreti sa folositi propriile module de stocare, spre exemplu intr-o baza de date MySQL, trebuie sa
creati implementari PHP ale acestor functii. Prototipurile vor arata astfel:
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)
Pentru a inregistra aceste functii, veti folosi session_set_save_handler():
session_set_save_handler
("sess_open","","sess_read","sess_read","sess_write","sess_destroy","sess_gc");
Propagarea ID-ului sesiunii
PHP 4 suporta urmatoarele metode de propagare a session ID-ului:
Cookie-uri ( standard )
GET/POST
Ascuns in URL, manual sau automat prin transmiterea URL-ului
Cookie-urile reprezinta calea cea mai simpla de a propaga ID-ul unei sesiuni. Alta cale este de a
transmite ID-ul prin GET/POST. In acest caz, url-ul dvs va fi spre exemplu script.php?=. Puteti crea
asemenea URL-uri utilizind constanta globala SID:
printf('<a href="script.php?%s">Link</a>', SID);
Redirectarea automata a URL-ului este o facilitate importanta a PHP-ului, permitindu-ne sa adaugam
session ID-ul sa toate link-urile de pe o pagina. Pentru a activa aceasta facilitate trebuie sa configurati
PHP cu -enable-trans-id si sa-l recompilati. In acest caz, session_ID va fi adaugat automat la toate
linkurile relative de pe pagina. In conluzie, cookie-urile sint cele mai folosite si cele ce incarca cel mai
putin serverul.