Användarnivå Output Buffertar: Skillnad mellan sidversioner

Från Wiki.linux.se
Hoppa till navigering Hoppa till sök
(Skapade sidan med '== 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 utmatnin...')
 
Ingen redigeringssammanfattning
Rad 1: Rad 1:
== Användar-Nivå Buffertar för Utmatning ==
== Användar-Nivå Buffertar för Utmatning ==
=== Innehållsförteckning ===
=== Innehållsförteckning ===
* Vad buffras i utmatningen?
* Vad buffras i utmatningen?
* Nästling av utmatningsbuffertar
* Nästling av utmatningsbuffertar

Versionen från 11 oktober 2024 kl. 14.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

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.