Posts Tagged header
Lucrul cu headere HTTP din PHP
Posted by admin in Php tutorial on February 3, 2010
Asa cum, in sistemul de fisiere, pe langa informatia utila dintr-un fisier sunt stocate si informatii despre acesta (data crearii, a ultimei modificari etc), la fel intr-un mesaj HTTP sunt transmise, pe langa datele efective, informatii de control (ex: informatii despre continutul mesajului, despre client, server etc). Aceste informatii aditionale poarta denumirea de headere HTTP si sunt importante pentru programatorul PHP deoarece prin intermediul lor se realizeaza operatii precum:
- redirectionarea clientului catre o alta adresa (prin intermediul headerului Redirect)
- specificarea tipului de continut pe care serverul il trimite clientului, astfel incat browserul web sa stie cum sa trateze acel continut: sa il afiseze direct (daca este vorba de text simplu), sa il afiseze formatat (daca este sursa HTML), sa il deschida cu ajutorul unui plug-in1 (daca este de tip PDF sau doc) etc. Toate acestea sunt posibile prin intermediul headerului HTTP Content-type
- setarea unui cookie (memorarea unei informatii pe client, in scopul extragerii ei ulterioare) – cu ajutorul headerului Set-Cookie (vezi sectiunea despre cookies in cadrul acestui material)
- specificarea strategiei de caching a browserului pentru pagina ceruta – cu ajutorul headerelor Cache-Control si Expires. Browserele internet incearca in general sa pastreze in cache cat mai multa informatie posibila, astfel incat utilizatorul sa aiba dublul avantaj al vitezei si al consumului mai mic de banda. Uneori insa pastrarea unei copii a unei pagini pe client nu este dezirabila (ex: pentru paginile generate dinamic, al caror continut se poate schimba de la o cerere la alta)
Headerele sunt de forma Nume-Header: informatii. In mesajul HTTP, headerele se afla intotdeauna inaintea! continutului mesajului si sunt separate de acesta printr-o linie goala. De aceea. este important ca, atunci cand o aplicatie genereaza dinamic continut web (inclusiv headere HTTP atasate acestui continut), headerele sa fie generate inaintea oricarui alt output al aplicatiei generatoare.
Lucrul cu headere HTTP din PHP
PHP pune la dispozitia programatorului cateva functii predefinite pentru lucrul cu headere HTTP:
- header() – folosita pentru a trimite headere HTTP specificate de programator catre client
- headers_sent() - folosita pentru a verifica daca headerele au fost deja trimise catre client (caz in care nu mai putem adauga altul)
- headers__listO - returneaza lista de headere destinate clientului (care au fost deja trimise sau care sunt in asteptare)
Functia header are urmatorul prototip:
void header ( string $header [, bool $replace [, int $http_response_code]]
lata semnificatiile argumentelor:
- Sheader - reprezinta headerul HTTP in forma in care acesta apare in mesajul HTTP (exemplu: “Location: http://www.example.com/index.php“)
- Sreplace - indica daca, in caz ca exista deja un header cu acelasi nume, noul header sa il inlocuiasca pe cel vechi sau sa fie adaugat listei de headere ce trebuie trimise clientului.
- $http_response_code - specifica codul de raspuns HTTP care sa fie trimis clientului. Codurile de raspuns HTTP sunt formate din 3 cifre, iar in functie de prima cifra pot avea urmatoarele semnificatii:
- 1xx – coduri de informare a clientului, intermediare o
- 2xx – coduri ce indica succesul unei cereri a clientului o
- 3xx – redirectionari
- 4xx - indica o eroare din partea clientului (ex: 404 – Not Found)
- 5xx – erori ale serverului sau incapacitatea acestuia de a onora cererea clientului (ex: 503 Service Unavailable)
//fortam aparitia ferestrei de save in loc de simpla afisare formatata in browser header (“Content-di sposition: attachment; filename=statistici.html”);
// trimiterea unui fisier .doc prin intermedin”! unui script PHP header(“Content-type: text/html”);
HTTP este un protocol stateless – fiecare cerere este tratata de catre server independent de celelalte, serverul nu isi “aminteste” ce s-a intamplat la cererile anterioare si nu coreleaza in vreun fel mai multe cereri, chiar daca ele provin de la acelasi client sau daca corespund unor resurse aflate in acelasi site.
Solutii pentru memorarea informatiei intre doua cereri
Pentru ca serverul sa poata mentine informatii care tin de un anume client de la o cerere a acestuia la alta, este necesara salvarea datelor in cauza la incheierea unei cereri si incarcarea lor la cererea urmatoare. Memorarea acestor date se poate face:
• pe client. Solutia este mecanismul de cookies – mici cantitati de informatie pe care serverul web le poate stoca pe hard-disk-ul clientului, urmand ca ele sa-i fie trimise inapoi serverului la cererile urmatoare pe care clientul le efectueaza (vezi mai jos sectiunea despre cookies)
• pe server. Solutia este sistemul de management al sesiunilor: serverul aloca clientului un spatiu de stocare pentru informatii proprii (variabile de sesiune), in care acestea se salveaza la incheierea fiecarei cereri si se incarca inapoi la urmatoarea cerere care este detectata a veni de la acelasi client. Mecanismul de stocare este dublat de unul de identificare a clientului, care permite serverului sa recunoasca cereri disparate ca venind de la acelasi client (vezi sectiunea despre sesiuni). Felul in care se face salvarea informatiilor de sesiune este configurabil de catre administratorul serverului web si al modulului de PHP (se poate face in fisiere, baze de date etc.)