Munkavégzés a http-fejlécek php problémamegoldás
Ebben a bevezető cikket nézzük meg a standard PHP funkciók dolgozni HTTP-fejléceket. Úgy véljük, részletesen előnyeiről és hátrányairól ezeket a funkciókat.
header () függvény
header () függvény írja a tömb fejlécében az aktuális HTTP-válasz fejléc egyszer. A függvény egy kötelező argumentum string string, amelynek tartalmaznia kell egy fejlécet.
A második opcionális argumentum bool cserélje engedélyezi vagy letiltja újraírása mód fejléce értéket. Ha az argumentum igaz, akkor az új címek felváltja a már tárolt egy sor fejlécek ugyanazzal a névvel. Ha az argumentum hamis, akkor az új értéket a meglévő fejlécet hozzáadjuk az előző fejléc vesszővel. Például: PHP Ennek eredményeként a válasz fejlécet egyike lesz fejléc két HTTP értékek Azonban, ha csak tudom, minden küldött az értéke ez a cím, akkor könnyebb írni, hogy egy sorban: PHP
A harmadik választható int http_response_code tartalmazhat állam (válasz kód) kódot, amely szerint a status bar is megváltozik.
Azonban annak ellenére, hogy a header () függvény a címsorban a nyers formában, ez nem annyira liberális, hogy írjon címoldalára amit adja át. Vannak bizonyos korlátozások a formátumot a rögzített címeket. Ha a követelmények nem teljesülnek, akkor a legjobb esetben vezet hiányában a várható sorban címek át az ügyfélnek. A legrosszabb esetben az ügyfél választ kap egy státusz kódot 500 Internal Server Error.
header () függvény két fajta vonalak átvihetők: vonal állapot és a HTTP-fejlécet.
A továbbított HTTP-fejlécek következő megkötésekkel: Úgy kell tartalmaznia a nevet és a fejléc értéke, kettősponttal elválasztva. Ha nincs neve vagy értéke hiányzik egy kettőspont, majd ezt a sort nem tekinthető egy cím és figyelmen kívül hagyja. Ezen felül a fejléc név csak ASCII karaktereket. Nincsenek más korlátozások nevei és értékei nincsenek jelen. Akkor kitalálni a saját fejlécét, és elküldi őket valaki, hogy tetszik. A szabvány szerint a HTTP protokoll ismeretlen fejléceket kell küldeni minden része a lánc, és a böngészők az értelmezése megnevezéseket kell figyelmen kívül hagyni őket.
Egy vitathatatlan előnye funkció header (), hogy lehet módosítani a válasz állapotát vonal HTTP. Az állapotsor mindig az első sorban a tömbben címeinek és formátuma a következő: HTTP
protokoll változata lehet egy konkrét példa 1.0 vagy 1.1, és a teljes ilyen 1.x Azonban, amikor próbál írni egy adott protokoll verzióját, azt tapasztaltam, hogy az ügyfél még mindig megy globális sablon 1.x Talán itt nem lehet hibáztatni a PHP és az Apache szerver, ami valahogy kezeli fejlécek elküldése előtt.
Status Code - numerikus kódot korrelál egy bizonyos típusú választ. Feldolgozása nem létező állapot kódokat verziójától függ az Apache szerver. A régebbi verziók nem teszik lehetővé, hogy küldjön az érvénytelen állapot kódot. Amikor megpróbálja átadni egy ismeretlen állapot kód (pl 430 vagy 600), az ügyfél választ kap egy hiba: HTTP
Ugyanakkor az új változat a Apache 2 küldhetnek nem létező állapot kódokat. „OK”, teszi hozzá magyarázó mondat nem létező állapot kód Apache 2.
Elmagyarázza a kifejezést nem lehet nyilvánított. Ha nem adja át, akkor az Apache maga dopishet ez alapján az állami kódot. Ha át néhány önkényes magyarázó mondat, hogy továbbra is újraírták a standard kifejezés alapján a továbbított státusz kódot.
A header () függvény létezik egy speciális viselkedése, ha hozzá egy hely fejlécet. Amellett, hogy hozzá ez a cím változás hatással van az állapotsorban a HTTP / 1.x 302 talált. De ha be kell állítani egy másik állapot kódot, például 307 Ideiglenes átirányítás, akkor szüksége lesz egy kiegészítő funkció hívás header (), megváltoztatni a status bar. Nem számít, ez fog történni, mielőtt felveszi a Hely fejléc, vagy azt követően - a változások mentésre kerülnek, és elküldi a kliensnek. De van egy sokkal elegánsabb módon használja a harmadik argumentum int http_response_code. Cím helyen status code 307, akkor adjunk hozzá egy sort az alábbiak szerint: PHP
A változások fényében a PHP 4.3.0, mely lehetővé tette, hogy változtatni a status bar ilyen módon, akkor elég értelmetlen változás a status bar kifejezetten (kivéve egyértelműség). Végtére is, sőt, mint láttuk fentebb, a header () függvény csak reagál az állapot kódot, amelyet utalt rá az állapotsorban. A változata a protokoll és a magyarázó mondat Apache mindig felveszi a saját belátása szerint. Érvénytelen állami kódok http_response_code érv kezelni, ugyanúgy, mint amikor elküldi őket az állapotsorban. További információ a állapotkódokról hivatkozás nélkül PHP olvasható a cikkben kódok HTTP státusz.
Ha a header () függvény fontos megjegyezni, hogy a rekord a válasz fejlécét csak lehetséges, amíg nem korai visszavonása adatokat a kimeneti stream. Amint kimenetét a képernyőre (a tervezési echo, print, print_f et al., Vagy csak a szöveges vagy kívüli terekben címkék ), Valamint azok által küldött első adatok és válasz fejlécét. Ha majd próbálja felvenni a válasz fejléce, akkor megkapja a következő figyelmeztetés:
Figyelem: Nem lehet módosítani header információk - headers already sent by
majd jelentette a PHP-script fájlt, és a kódsort, amely indult a kimenő adatok a kimeneti áramot.
headers_list () funkció
headers_list () funkció csak az ötödik változat a PHP. Ez adja vissza csak azokat a címeket, amelyeket hozzáadott a PHP-script. Ha nem regisztrált címek, a függvény visszatérési csak a fejléc X-Powered-By: PHP / 5.2.10. és akkor sem mindig. Persze, nem lehet másképpen, mert minden más címoldalára szerver nyilvántartások végrehajtása után PHP szkripteket.
Sőt, ez a funkció nem adja vissza a status bar, akkor is, ha megváltozott a PHP-script.
headers_sent () funkció
A debug funkció, amely jelzi, hogy a kliens fejlécét az aktuális HTTP-válasz küldeni. Két opcionális paraméterek lehetővé teszi számunkra, hogy írjon a nevében változók átadott PHP script (Az első érv) és a sor száma (a második argumentum), amely megkezdte kimenet a kimeneti stream, hogy mely címek küldtek.
getallheaders () funkció
Ez a funkció csak akkor működik, ha a PHP fut Apache modulként. Ahhoz, hogy ezt a tényt nyilvánvalóbb volt, kiindulási PHP 4.3.0, ezt a funkciót megkapta a beceneve apache_request_headers ()
valamint az összes környezeti változókat nevek „HTTP_IMYA_ZAGOLOVKA”, amely létrehoz egy szerver alapú fejlécét az aktuális HTTP-kérést. Az egyéb környezeti változók, amelyek a kérés fejlécét: $ _SERVER [ „HTTP_KEEP_ALIVE”]. $ _SERVER [ 'HTTP_CACHE_CONTROL']. $ _SERVER [ 'http_referer']. Ezek az elemek lehetnek jelen a tömbben, ha az ügyfél nem adta át a megfelelő kérés fejlécét.
Sajnos, lehetetlen tudni, a HTTP protokoll kliens verzióját, amely tartalmazza a query string.
Az egyik előnye getallheaders () függvény a tömb $ _SERVER, hogy olyan fejléceket neveket eredeti formájukban, míg a „HTTP_” előtaggal egészül ki az $ _SERVER tömbben a neve a fejlécben. Tekintettel azonban arra a tényre, hogy a cím nevek kis-és nagybetűk, az ügyfél átadhatja a neveket kisbetűvel és a nagybetűket lehet vagy kivételes esetekben, bármely egzotikus nyilvántartások változata. Ez bonyolítja a keresést érdekes címet a tömb, amely biztosítja getallheaders () függvényt. Az array $ _SERVER ez nem probléma - nem mind egy értéket a tömbből mindig nagybetűvel.
get_headers () funkció
Mielőtt verzió PHP 5.3.0, ezt a funkciót egy hátránya, amely korlátozza az alkalmazását kizárólag hibakeresés. Logikája szerint a HTTP protokoll, ez a funkció az lenne, hogy végezzen egy kérést eljárás HEAD, mert ez csak a fejléceket. Azonban, ha hívja a PHP függvény távoli szerver küld egy kérést a következő: HTTP
Természetesen ez a lekérdezés visszaadja a távoli szerver nem csak a főcímeket, de a tartalma a forrás, ami összehasonlítva a fejléc foglal térfogatban néha százszor nagyobb. Így ez nem nagymértékben racionális vizsgálódás értelmetlen előfeszítő kiszolgálók és hálózati routerek és átjárók között. HTTP protokoll fejlesztők erősen küzd megkönnyítve a növekvő terheket a hálózati és szoftver megoldások, mint get_headers () függvény, vagy inkább a meggondolatlan felhasználása csökkenti ezeket az erőfeszítéseket semmivé.
Azonban a PHP változat 5.3.0 e hiba megszűnt az Advent stream_context_set_default () függvényt. Még verziótól kezdődően 5.1.3 get_headers () függvény az alapértelmezett patak összefüggésben. De a patak összefüggésben konfiguráció módosítása tette lehetővé, csak a verzió 5.3.0, például, hogy módosítsa a kérelmet módszer. PHP
Persze ezt meg kell tenni, mielőtt hívja get_headers () függvényt.
HTTP-HEAD kérés módszer került bevezetésre vissza a HTTP / 1.0 Ezt a módszert fejlesztettek ki, csak ilyen alkalmakkor. Az RFC 1945 leírások hangsúlyozta, hogy ez a módszer azonos a GET módszert, kivéve, hogy nem tér vissza a tartalmát a forrás. Az igazság az RFC 2616 HTTP / 1.1 feltétele a visszatérő azonos a címe, összehasonlítva a GET módszernek kell szintű követelményeket, azaz előnyösen, de nem szükségszerűen storogo (lásd. érdekes HEAD módszer). A legnépszerűbb Apache szerver támogatja ezt a követelményt. Azt feltételezzük, hogy sok más szerverek is támogatja őt.