Vad buffras i utmatningen?: Skillnad mellan sidversioner

Från Wiki.linux.se
Hoppa till navigering Hoppa till sök
Rad 1: Rad 1:
== Vad Buffras i Utmatningen? ==
== Användar-Nivå Buffertar för Utmatning ==
PHP:s utmatningsbuffertar på användarnivå buffrar all utmatning efter att de har startats tills de stängs av eller skriptet avslutas. Utmatning i kontexten av PHP:s utmatningsbuffertar på användarnivå är allt som PHP skulle visa eller skicka tillbaka till webbläsaren. I praktiska termer är utmatning icke-noll-längdsdata som är:


* utanför<?php ?> -taggarna
=== Innehållsförteckning ===
* utskrivet av språkkonstruktioner och funktioner vars explicita syfte är att skriva ut användarens variabler eller strängar, såsom <pre>echo</pre>, <pre>print</pre>, <pre>printf()</pre>, <pre>var_dump()</pre>, <pre>var_export()</pre>, <pre>vprintf()</pre>
* Vad buffras i utmatningen?
* utskrivet av funktioner vars syfte är att samla in och skriva ut data/information om det körande skriptet eller PHP, såsom <pre>debug_print_backtrace()</pre>, <pre>phpcredits()</pre>, <pre>phpinfo()</pre>, <pre>ReflectionExtension::info()</pre>
* Nästling av utmatningsbuffertar
* utskrivet av PHP vid ett icke fångat undantag eller ett ohanterat fel (beroende inställningarna för <pre>display_errors</pre> och <pre>error_reporting</pre>)
* Buffertstorlek
* allt som skrivs till <pre>php://output</pre>
* Tillåtna operationer buffertar
* Utmatningshanterare
* Arbete med utmatningshanterare
* Flaggor som skickas till utmatningshanterare
* Returvärden från utmatningshanterare


''Observera:'' Data som skrivs direkt till stdout eller skickas till en SAPI-funktion med liknande funktionalitet kommer inte att fångas upp av utmatningsbuffertar användarnivå. Detta inkluderar att skriva data till stdout med <pre>fwrite()</pre> eller att skicka headers med <pre>header()</pre> eller <pre>setcookie()</pre>.
Användarnivåns utmatningsbuffertar kan startas, manipuleras och avslutas från PHP-kod. Varje buffert inkluderar en utmatningsbuffert och en associerad utmatningshanterarfunktion.
 
=== Aktivera Utmatningsbuffring ===
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.37

Användar-Nivå Buffertar för Utmatning

Innehållsförteckning

  • 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.

Aktivera Utmatningsbuffring

Utmatningsbuffring kan aktiveras genom att använda funktionen

ob_start()

eller genom att ställa in

output_buffering

och

output_handler

i php.ini. Även om båda kan skapa utmatningsbuffertar, är

ob_start()

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

ob_start()

kommer vara aktiva från den rad som funktionen anropades, medan de som startas med

output_buffering

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

output_add_rewrite_var()

och/eller genom att aktivera

session.use_trans_sid

i php.ini. Den bundna zlib-tillägget har sin egen utmatningsbuffert som kan aktiveras genom att använda inställningen

zlib.output_compression

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

ob_start()

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

ob_flush()

,

ob_end_flush()

eller

ob_get_flush()

anropas. Varning: Anrop av

ob_end_flush()

eller

ob_get_flush()

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

ob_gzhandler()

komprimeras utmatningen och flushar den komprimerade utmatningen. Innehållet i den aktiva bufferten kan hämtas genom att anropa

ob_get_contents()

,

ob_get_clean()

eller

ob_get_flush()

. Om endast längden på buffertens innehåll behövs, kommer

ob_get_length()

eller

ob_get_status()

att returnera längden på innehållet i bytes. Varning: Anrop av

ob_get_clean()

eller

ob_get_flush()

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

ob_clean()

,

ob_end_clean()

eller

ob_get_clean()

. Varning: Anrop av

ob_end_clean()

eller

ob_get_clean()

kommer att stänga av den aktiva bufferten.

Stänga Av Buffertar

Utmatningsbuffertar kan stängas av genom att anropa

ob_end_clean()

,

ob_end_flush()

,

ob_get_flush()

eller

ob_get_clean()

. Varning: Utmatningsbuffertar som startats utan flaggan

PHP_OUTPUT_HANDLER_REMOVABLE

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

exit()

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

ob_flush()

,

ob_end_flush()

eller

ob_get_flush()

, 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

PHP_OUTPUT_HANDLER_DISABLED

.

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

ob_flush()

,

ob_end_flush()

eller

ob_get_flush()

, flushas bufferten beroende på 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

PHP_OUTPUT_HANDLER_DISABLED

.

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

ob_flush()

,

ob_end_flush()

eller

ob_get_flush()

, 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

ob_get_flush()

. Under flush-operationer (anrop av

ob_flush()

,

ob_end_flush()

,

ob_get_flush()

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

exit()

i samma beteende. Observera: Om en hanterare returnerar false, sätts dess statusflagga

PHP_OUTPUT_HANDLER_DISABLED

.

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

ob_get_status()

. Om hanteraren exekveras framgångsrikt och inte returnerar false, sätts

PHP_OUTPUT_HANDLER_STARTED

och

PHP_OUTPUT_HANDLER_PROCESSED

. Om hanteraren returnerar false eller slänger ett undantag under exekvering, sätts

PHP_OUTPUT_HANDLER_STARTED

och

PHP_OUTPUT_HANDLER_DISABLED

. Observera: Om

PHP_OUTPUT_HANDLER_DISABLED

är satt för en hanterare kommer hanteraren inte att anropas av

ob_end_clean()

,

ob_end_flush()

,

ob_get_clean()

,

ob_get_flush()

eller under PHP:s avstängningsprocess. Denna flagga har ingen effekt när

ob_clean()

eller

ob_flush()

anropas.