Vad buffras i utmatningen?: Skillnad mellan sidversioner

Från Wiki.linux.se
Hoppa till navigering Hoppa till sök
Ingen redigeringssammanfattning
Rad 1: Rad 1:
== Användar-Nivå Buffertar för Utmatning ==
== Vad Buffras i Utmatningen? ==


=== Innehållsförteckning ===
PHP:s användarnivåbuffertar för utmatning buffrar all utmatning efter att de har startats tills de stängs av eller skriptet avslutas. Utmatning i sammanhanget för PHP:s användarnivåbuffert är allt som PHP skulle visa eller skicka tillbaka till webbläsaren. I praktiska termer är utmatning data med icke-nollängd som är:
* Vad buffras i utmatningen?
* Nästling av utmatningsbuffertar
* Buffertstorlek
* Tillåtna operationer på buffertar
* Utmatningshanterare
* Arbete med utmatningshanterare
* Flaggor som skickas till utmatningshanterare
* Returvärden från utmatningshanterare


Användarnivåns utmatningsbuffertar kan startas, manipuleras och avslutas från PHP-kod. Varje buffert inkluderar en utmatningsbuffert och en associerad utmatningshanterarfunktion.
* utanför <?php ?>-taggarna
* skrivet ut av språkstrukturer och funktioner vars uttryckliga syfte är att skicka ut användartillhandahållna variabler eller strängar, såsom [[echo]], [[print]], [[printf()]], [[var_dump()]], [[var_export()]], [[vprintf()]]
* skrivet ut av funktioner vars syfte är att samla och skicka ut data/information om det körande skriptet eller PHP, såsom [[debug_print_backtrace()]], [[phpcredits()]], [[phpinfo()]], [[ReflectionExtension::info()]]
* skrivet ut av PHP vid ett okänt undantag eller ett ohanterat fel (beroende på inställningarna för [[display_errors]] och [[error_reporting]])
* allt som skrivs till [[php://output]]


=== Aktivera Utmatningsbuffring ===
''Observera:'' Data som skrivs direkt till stdout eller skickas till en SAPI-funktion med liknande funktionalitet kommer inte fångas av utmatningsbuffertarna användarnivå. Detta inkluderar att skriva data till stdout med [[fwrite()]] eller att skicka headers med [[header()]] eller [[setcookie()]].
Utmatningsbuffring kan aktiveras genom att använda funktionen <pre>ob_start()</pre> eller genom att ställa in <pre>output_buffering</pre> och <pre>output_handler</pre> i php.ini. Även om båda kan skapa utmatningsbuffertar, är <pre>ob_start()</pre> mer flexibel eftersom den accepterar användardefinierade funktioner som utmatningshanterare och tillåter att operationerna som är tillåtna på bufferten (flusha, rensa, ta bort) kan ställas in också. Buffertar som startas med <pre>ob_start()</pre> kommer vara aktiva från den rad som funktionen anropades, medan de som startas med <pre>output_buffering</pre> kommer buffra utdata från den första raden i skriptet.
 
PHP levereras också med en inbyggd "URL-Rewriter" utmatningshanterare som startar sin egen utmatningsbuffert och endast tillåter upp till två instanser av den att köra samtidigt (en för användarnivå URL-omskrivning och en för transparent sessions-ID-stöd). Dessa buffertar kan startas genom att anropa funktionen <pre>output_add_rewrite_var()</pre> och/eller genom att aktivera <pre>session.use_trans_sid</pre> i php.ini.
 
Den bundna zlib-tillägget har sin egen utmatningsbuffert som kan aktiveras genom att använda inställningen <pre>zlib.output_compression</pre> i php.ini.
 
''Observera:'' Även om "URL-Rewriter" är speciell i den meningen att den endast tillåter upp till två instanser av den att köra samtidigt, använder alla utmatningsbuffertar på användarnivå samma underliggande buffertar som används av <pre>ob_start()</pre> med deras funktionalitet implementerad av en anpassad utmatningshanterarfunktion. Som sådan kan all deras funktionalitet emuleras av användarkod.
 
=== Flusha, Åtkomst till och Rensa Buffertinnehåll ===
Flushning skickar och rensar innehållet i den aktiva bufferten. Utmatningsbuffertar flushas när storleken på utmatningen överstiger buffertens storlek; när skriptet avslutas eller när <pre>ob_flush()</pre>, <pre>ob_end_flush()</pre> eller <pre>ob_get_flush()</pre> anropas.
 
''Varning:'' Anrop av <pre>ob_end_flush()</pre> eller <pre>ob_get_flush()</pre> kommer att stänga av den aktiva bufferten.
 
''Varning:'' Flushning av buffertar kommer att flusha returvärdet från utmatningshanteraren vilket kan skilja sig från innehållet i bufferten. Till exempel, genom att använda <pre>ob_gzhandler()</pre> komprimeras utmatningen och flushar den komprimerade utmatningen.
 
Innehållet i den aktiva bufferten kan hämtas genom att anropa <pre>ob_get_contents()</pre>, <pre>ob_get_clean()</pre> eller <pre>ob_get_flush()</pre>.
 
Om endast längden på buffertens innehåll behövs, kommer <pre>ob_get_length()</pre> eller <pre>ob_get_status()</pre> att returnera längden på innehållet i bytes.
 
''Varning:'' Anrop av <pre>ob_get_clean()</pre> eller <pre>ob_get_flush()</pre> kommer att stänga av den aktiva bufferten efter att ha returnerat dess innehåll.
 
Innehållet i den aktiva bufferten kan rensas genom att anropa <pre>ob_clean()</pre>, <pre>ob_end_clean()</pre> eller <pre>ob_get_clean()</pre>.
 
''Varning:'' Anrop av <pre>ob_end_clean()</pre> eller <pre>ob_get_clean()</pre> kommer att stänga av den aktiva bufferten.
 
=== Stänga Av Buffertar ===
Utmatningsbuffertar kan stängas av genom att anropa <pre>ob_end_clean()</pre>, <pre>ob_end_flush()</pre>, <pre>ob_get_flush()</pre> eller <pre>ob_get_clean()</pre>.
 
''Varning:'' Utmatningsbuffertar som startats utan flaggan <pre>PHP_OUTPUT_HANDLER_REMOVABLE</pre> kan inte stängas av och kan generera en E_NOTICE.
 
Varje utmatningsbuffert som inte har stängts av i slutet av skriptet eller när <pre>exit()</pre> anropas kommer att flushas och stängas av av PHP:s avstängningsprocess. Buffertarna kommer att flushas och stängas av i omvänd ordning av deras start. Den sista bufferten som startades kommer att vara först, den första bufferten som startades kommer att vara sist att flushas och stängas av.
 
''Varning:'' Om flushning av buffertens innehåll inte önskas, bör en anpassad utmatningshanterare användas för att förhindra flushning under avstängning.
 
=== Undantag som Slängs i Utmatningshanterare ===
Om ett icke fångat undantag slängs i en utmatningshanterare, avslutas programmet och hanteraren anropas av avstängningsprocessen, varefter felmeddelandet "Icke fångat undantag" flushas.
 
Om det icke fångade undantaget slängs i en hanterare som anropas av <pre>ob_flush()</pre>, <pre>ob_end_flush()</pre> eller <pre>ob_get_flush()</pre>, flushas buffertens innehåll före felmeddelandet.
 
Om ett icke fångat undantag slängs i en utmatningshanterare under avstängning, avslutas hanteraren och varken buffertens innehåll eller felmeddelandet flushas.
 
''Observera:'' Om en hanterare slänger ett undantag, sätts dess statusflagga <pre>PHP_OUTPUT_HANDLER_DISABLED</pre>.
 
=== Fel som Uppstår i Utmatningshanterare ===
Om ett icke-fatalt fel uppstår i en utmatningshanterare fortsätter programmet att köra.
 
Om det icke-fatala felet uppstår i en hanterare som anropas av <pre>ob_flush()</pre>, <pre>ob_end_flush()</pre> eller <pre>ob_get_flush()</pre>, flushas bufferten beroende returvärdet från hanteraren. Om hanteraren returnerar false, flushas både bufferten och felmeddelandet. Om den returnerar något annat, flushas hanterarens returvärde men inte felmeddelandet.
 
''Observera:'' Om en hanterare returnerar false, sätts dess statusflagga <pre>PHP_OUTPUT_HANDLER_DISABLED</pre>.
 
Om ett fatalt fel uppstår i en utmatningshanterare, avslutas programmet och hanteraren anropas av avstängningsprocessen, varefter felmeddelandet flushas.
 
Om det fatala felet uppstår i en hanterare som anropas av <pre>ob_flush()</pre>, <pre>ob_end_flush()</pre> eller <pre>ob_get_flush()</pre>, flushas buffertens innehåll före felmeddelandet.
 
Om ett fatalt fel uppstår i en utmatningshanterare under avstängning, avslutas programmet utan att flush bufferten eller felmeddelandet.
 
=== Utmatning i Utmatningshanterare ===
I specifika omständigheter, flushas utmatning som produceras i hanteraren tillsammans med innehållet i bufferten. Denna utmatning läggs inte till i bufferten och är inte en del av strängen som returneras av <pre>ob_get_flush()</pre>.
 
Under flush-operationer (anrop av <pre>ob_flush()</pre>, <pre>ob_end_flush()</pre>, <pre>ob_get_flush()</pre> och under avstängning) om returvärdet från en hanterare är false, flushas innehållet i bufferten följt av utmatningen. Om hanteraren inte anropas under avstängning, resulterar hanteraren som slänger ett undantag eller anrop av <pre>exit()</pre> i samma beteende.
 
''Observera:'' Om en hanterare returnerar false, sätts dess statusflagga <pre>PHP_OUTPUT_HANDLER_DISABLED</pre>.
 
=== Statusflaggor för Utmatningshanterare ===
Hanterarens statusflaggor i buffertens flaggmask sätts varje gång utmatningshanteraren anropas och är en del av flaggorna som returneras av <pre>ob_get_status()</pre>. Om hanteraren exekveras framgångsrikt och inte returnerar false, sätts <pre>PHP_OUTPUT_HANDLER_STARTED</pre> och <pre>PHP_OUTPUT_HANDLER_PROCESSED</pre>. Om hanteraren returnerar false eller slänger ett undantag under exekvering, sätts <pre>PHP_OUTPUT_HANDLER_STARTED</pre> och <pre>PHP_OUTPUT_HANDLER_DISABLED</pre>.
 
''Observera:'' Om <pre>PHP_OUTPUT_HANDLER_DISABLED</pre> är satt för en hanterare kommer hanteraren inte att anropas av <pre>ob_end_clean()</pre>, <pre>ob_end_flush()</pre>, <pre>ob_get_clean()</pre>, <pre>ob_get_flush()</pre> eller under PHP:s avstängningsprocess. Denna flagga har ingen effekt när <pre>ob_clean()</pre> eller <pre>ob_flush()</pre> anropas.

Versionen från 12 oktober 2024 kl. 05.39

Vad Buffras i Utmatningen?

PHP:s användarnivåbuffertar för utmatning buffrar all utmatning efter att de har startats tills de stängs av eller skriptet avslutas. Utmatning i sammanhanget för PHP:s användarnivåbuffert är allt som PHP skulle visa eller skicka tillbaka till webbläsaren. I praktiska termer är utmatning data med icke-nollängd som är:

Observera: Data som skrivs direkt till stdout eller skickas till en SAPI-funktion med liknande funktionalitet kommer inte fångas av utmatningsbuffertarna på användarnivå. Detta inkluderar att skriva data till stdout med fwrite() eller att skicka headers med header() eller setcookie().