PHP pentru incepatori
Continuă să publice articole în seria «PHP pentru incepatori“, de data aceasta ne vom concentra pe tamponul de ieșire.
Dacă doriți, pe scurt despre modul în care buffer de ieșire standard, în PHP poate fi citit pe paginile conducerii oficiale. dar nu este metoda mea, voi vorbi cu exemple, și chiar pentru a asigura locuri de muncă le va da materialul.
Pentru a începe, da instalarea - O bufferele în PHP câteva, plus module de web-server poate efectua de tamponare, și chiar browsere pot fi redate cu concluzia și nu au prezentat imediat rezultatul (ar fi necesar aici pentru a reîmprospăta memoria, și chiar și pentru a menționa Netscape poate fi jupuit ).
Acum voi vorbi despre tamponare în PHP.
tampon de ieșire personalizat
Lucrul cu tampon de ieșire începe cu ob_start funcția () - în această funcție, există trei parametri opționali, dar ele sunt, voi vorbi despre mai târziu, dar nu uitați - utilizați ob_start () funcție pentru a activa bufferul de ieșire:
În cazul în care, cu toate acestea, avem nevoie pentru a salva datele, sau chiar modul de a trata concluzia că avem nevoie de ob_get_contents) funcția (. Salvați datele, puteți șterge sau dezactiva buffer - pentru aceasta vom folosi funcția ob_end_clean (). Dacă toate cele de mai sus redus la o grămadă, rezultatul obținem următorul cod:
Aproape toate funcțiile necesare sunt prefixate «ob_», nu este greu de ghicit este o abreviere a «tampon de ieșire»
ob_get_contents () funcție poate fi numit de mai multe ori, în practică, nu au văzut acest lucru:
Dacă începe tampon lui de ieșire, dar din anumite motive nu a oprit, atunci PHP va face pentru tine și la sfârșitul script-ul pentru a efectua o „resetare“ a tampon de ieșire în browser-ul utilizatorului
Dacă blocul ob_start interior - ob_end trimite un antet, nu se încadrează în tampon, și va fi trimis imediat la browser:
Ca urmare, codul va apărea în următoarele antete http-pachet:
Desigur, acest cod nu este nimic mai afișează va fi o pagină goală.
Această regulă privind trimiterea antetele este la fel de adevărat pentru antet directă funcția de apel (). și implicit în apelul la session_start ():
Aici este o mică viață-hack - în PHP puteți utiliza paranteze <> pentru a evidenția o anumită logică în blocuri, cu nici o sarcină funcțională care le transporta, dar lizibilitatea codului - creștere
clarificat ușor situația - acum în banca cunoștințelor noastre nu există informații cu privire la modul de a activa buffer ca să primească date de la ea, și cum să-l opriți. Ceea ce este mai interesant, puteți obține cu el? Da, practic, nimic cu ea și într-adevăr - puteți (resetare) trimite la browser (la același nivel de cuvinte cheie), curat (curat), dezactivați (final). Deci, se combină toate acestea, până la gramada este de asemenea posibil:
- ob_clean () - citește numele funcției ca „clar bufferul de ieșire“
- ob_flush () - «trimite tampon de ieșire“
- ob_end_clean () - «dezactiva tampon de ieșire și clar“
- ob_end_flush () - «bufferul de ieșire este oprit și trimis la browser-ul“
- ob_get_clean () - «obținem tampon de ieșire, purifica și dezactivează“ - există o abatere mică de la normele, această funcție ar trebui să fie menționată ca ob_get_end_clean (). dar am decis să simplifice și au aruncat capăt
- ob_get_flush () - «trimite tampon de ieșire, purifica și dezactiva», ob_get_ final _flush ()
Ce poate fi de următoarele face cu tamponul de ieșire este determinată de al treilea parametru $ steaguri opționale la apelarea funcției ob_start (). rar folosite
Pentru aducere aminte ușor aici puteți găsi o placă pe familia de funcții:
sarcină
Completati codul de mai jos prin apelarea unei funcții pe care el a dedus în mod corect «Bună ziua lume»:
tampon handler
Este timpul pentru a reveni la funcția ob_start () și primul său parametru - $ output_callback - handler tampon de ieșire. Callback-funcție, care preia conținutul memoriei tampon ca parametru de intrare și șirul trebuie să se întoarcă după tratamentul trebuie specificat ca un handler tampon:
În acest exemplu, funcția de tratare a liniei de retur «Lungimea string«Hello World»este de 11“.
Un punct important - cu aceste caracteristici trebuie să fie atent, rânduri prelucrate ladnenko, dar nu încerca să aducă orice salva datele, nu încercați să înceapă un alt tampon de ieșire într-o funcție, și da, există funcții care creează bufferul de ieșire din interiorul vostru, e print_r () și highlight_file ( ) este un exemplu
Puteți întâlni ob_gzhandler () din procesoarele standard. dar o compresie mai bună a paginilor lăsate pe umerii web-server, și nu-l atârnă pe PHP.
Mai mult timp, a doua fază parametru $ apel invers-funcția poate include steaguri din PHP_OUTPUT_HANDLER_ de familie *. dar, această informație nu va avea nevoie, eu chiar nu a putut gândi la un exemplu de ce este necesar.
În tamponul de ieșire a Keeler-caracteristică - puteți începe un alt tampon în tampon, și într-o nouă și cu atât mai mult pe (atâta timp cât există suficientă memorie):
În această funcție exemplul ob_flush () și derivații săi va „arunca“ conținutul buffer-ului la un nivel superior.
Această abordare va ajuta atunci când aveți nevoie pentru a conecta codul terță parte, și dintr-o dată el poate lua ceva și să aducă - ar fi înțelept să-și încheie producția la buffer-ul, chiar dacă toate codul este deja înfășurat într-un alt tampon.
Dacă nu știi exact ce „profunzime“ sunt - funcția de utilizare ob_get_level (). și să „se trezească“, este util să vă următorul cod:
sarcină
Efectuați modificări codului cu ob_start () apeluri imbricate, astfel încât numerele afișate în ordine inversă, pentru acest lucru este necesar pentru a rearanja cele trei linii de cod.
buffer „Implicit“
Dacă doriți să creați un înveliș peste întregul cod, atunci este posibil să se utilizeze soluția „din cutie“ - „default“ tampon de ieșire pentru activarea acestuia se întâlnește output_buffering directivă. acesta poate fi pus în On. și specificați dimensiunea buffer-ului de care avem nevoie (atunci când este atinsă limita, tamponul va fi trimis la browser-ul utilizatorului). Această directivă ar trebui să fie indicată fie în php.ini, sau .htaccess (pentru Apache), o încercare de a seta această valoare pentru a utiliza ini_set () la nimic să nu conducă, așa cum PHP începe deja sa, și tamponul de ieșire este deja configurată în conformitate cu setările:
Dacă atunci când memoria tampon pentru a verifica nivelul de imbricare și cauza ob_get_level funcția (). obținem 1:
Ie dacă includeți tamponul, va fi posibil, pentru a evita un fel de «antetele trimise deja» eroare? Da, atâta timp cât suficient de tampon, dar niciodată nu a făcut, de fapt, bazându-se pe această metodă, sunt de fapt bomba a fost plantat, și nu se cunoaște când „explodează“ și presărarea erori:
Amintiți-vă, pentru aplicațiile CLI Directiva output_buffering întotdeauna 0; Acest tampon este dezactivat
De ce toate astea?
Bună întrebare - de ce să lucreze cu tampon de ieșire? Iată câteva scenarii de bază:
- Comprimarea datelor transferate - cu ajutorul ob_gzhandler deja menționat ()
- retragere întârziată pentru a evita greșelile «antetele trimise deja» (despre eroarea descrisă în detaliu în sesiune)
- Lucrul cu codul altor persoane, care încearcă să dețină ieșire ceva
- Lucrul cu fișiere HTML atunci când aveți nevoie pentru a conecta un fișier text (de obicei, o chestiune de HTML), pentru a lucra mai departe cu conținutul său
script de eroare de manipulare includ fișiere - fișiere antet tampon startuete, dacă ceva nu merge bine, atunci conținutul bufferului poate arunca, și în loc de mesaje de eroare uninformative, scoate cel puțin un mesaj informativ pe care serverul a fost rău, și nu poate fi nimic altceva.
Exemplu de lucru cu erori critice puteți găsi în manipularea articol de eroare. și există, de asemenea, referire la buffer-ul de ieșire, oh văzut totul bine-bine-bine motiv ulterior
tampon de ieșire Sistem
Cu tamponul de ieșire utilizator înțeles, să ne trece acum la sistem - este un tampon de afișare, care este umplut în timpul executării script-ul și a trimis la browser-ul de la sfârșitul execuției. Ie tamponul de ieșire este întotdeauna acolo, nu este necesar să se creeze, dar o putem gestiona.
Asta e atât de simplu și concis, bine, acum despre nuanțele de tampon de ieșire sistem de control ...
Royal flush
10 secunde de atenție ...
Și acum de interes academic, să ne uităm la punerea în aplicare a „acțiunii“ - există destul de un pic de cod, și o mână de cunoștințe utile despre PHP:
Imediat lovit de izbucnirile de apel () funcție - apelarea la această funcție, da o indicație PHP «reset» tampon de sistem, de exemplu, trimite toate că există în browserul utilizatorului (dar să fie avertizat, dacă ați început tamponul de utilizator, atunci trebuie mai întâi să „piardă“ ea, și doar apoi apel la același nivel ()). Ie un eveniment poate fi descris ca:
O altă caracteristică, pe care trebuie să-și amintească - Directiva implicit_flush. El este responsabil pentru asigurarea că, după fiecare ieșire apelează automat la același nivel (). prin urmare, următoarea combinație de muncă în exemplul anterior:
Această directivă poate fi schimbată „din zbor“, este suficient pentru a provoca ob_implicit_flush () funcție (următoarea surprinzătoare având în vedere funcția este încă poartă numele de cost implicit_flush () ca ieșire tampon pentru utilizator trebuie să facă un raport indirect -. După ce suna ob_flush () va numita flush ()):
Aceste exemple funcționează numai atunci când off output_buffering. în caz contrar, va trebui să-l forțeze pentru a opri și clar în scenariu. Dacă lucrați în CLI, atunci implicit_flush știu întotdeauna și în afara output_buffering, prin urmare, toate de ieșire va cădea imediat în consolă
Pentru a efectua această sarcină aveți nevoie de o reîmprospătare a cunoștințelor cu privire la dosar de conectare
Pentru a consolida materialul studiat, aveți nevoie pentru a pune în aplicare un motor de templating simplu, care va revitaliza următorul cod:
literatura recomandată
în concluzie
Tema de tamponare va reveni din nou și din nou, în timp ce lucrează pe proiecte PHP, și crede-mă, trebuie să cunoască și să înțeleagă în ce moment „blocat“ concluzia, astfel încât să nu pierdeți timpul de lucru pe codul de diagnostic și merge direct la cauzele problemelor.