Användarnivå Output Buffertar
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
Utmatningsbuffertar på användarnivå kan startas, manipuleras och avslutas från PHP-kod. Varje buffert inkluderar en utmatningsbuffert och en associerad utmatningshanterarfunktion.
Aktivera Utmatningsbuffring
Utmatningsbuffring kan aktiveras med 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 inställning av vilka operationer som är tillåtna på bufferten (flusha, rensa, ta bort). Buffertar som startas med ob_start()
kommer vara aktiva från den rad där funktionen anropas, medan de som startas med output_buffering
kommer buffra utmatning från första raden i skriptet.
PHP levereras även 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 output_add_rewrite_var()
-funktionen och/eller genom att aktivera session.use_trans_sid
i php.ini.
Den inbyggda zlib-modulen 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 samtidigt, använder alla utmatningsbuffertar på användarnivå samma underliggande buffertar som används av ob_start()
med sin funktionalitet implementerad av en anpassad utmatningshanterarfunktion. Således kan all dess 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 under PHP:s avstängningsprocess. Buffertarna kommer att flushas och stängas av i omvänd ordning av deras start. Den sist startade bufferten kommer att vara först, och den först startade bufferten 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 flusha 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 slängning av 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.