Vad buffras i utmatningen?

Från Wiki.linux.se
Hoppa till navigering Hoppa till sök

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.