Användarnivå Output Buffertar: Skillnad mellan sidversioner
Admin (diskussion | bidrag) Ingen redigeringssammanfattning |
Admin (diskussion | bidrag) |
||
Rad 13: | Rad 13: | ||
=== Aktivera Utmatningsbuffring === | === Aktivera Utmatningsbuffring === | ||
Utmatningsbuffring kan aktiveras med funktionen <code>ob_start()</code> eller genom att ställa in <code>output_buffering</code> och <code>output_handler</code> i php.ini. Även om båda kan skapa utmatningsbuffertar är <code>ob_start()</code> 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 <code>ob_start()</code> kommer vara aktiva från den rad där funktionen anropas, medan de som startas med <code>output_buffering</code> kommer buffra utmatning från första raden i skriptet. | Utmatningsbuffring kan aktiveras med funktionen <code>[[ob_start()]]</code> eller genom att ställa in <code>output_buffering</code> och <code>output_handler</code> i php.ini. Även om båda kan skapa utmatningsbuffertar är <code>ob_start()</code> 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 <code>ob_start()</code> kommer vara aktiva från den rad där funktionen anropas, medan de som startas med <code>output_buffering</code> 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 <code>output_add_rewrite_var()</code>-funktionen och/eller genom att aktivera <code>session.use_trans_sid</code> i php.ini. | 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 <code>output_add_rewrite_var()</code>-funktionen och/eller genom att aktivera <code>session.use_trans_sid</code> i php.ini. | ||
Rad 22: | Rad 22: | ||
=== Flusha, Åtkomst till och Rensa Buffertinnehåll === | === 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 <code>ob_flush()</code>, <code>ob_end_flush()</code> eller <code>ob_get_flush()</code> anropas. | 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 <code>[[ob_flush()]]</code>, <code>[[ob_end_flush()]]</code> eller <code>[[ob_get_flush()]]</code> anropas. | ||
''Varning:'' Anrop av <code>ob_end_flush()</code> eller <code>ob_get_flush()</code> kommer att stänga av den aktiva bufferten. | ''Varning:'' Anrop av <code>[[ob_end_flush()]]</code> eller <code>[[ob_get_flush()]]</code> 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 <code>ob_gzhandler()</code> komprimeras utmatningen och flushar den komprimerade utmatningen. | ''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 <code>[[ob_gzhandler()]]</code> komprimeras utmatningen och flushar den komprimerade utmatningen. | ||
Innehållet i den aktiva bufferten kan hämtas genom att anropa <code>ob_get_contents()</code>, <code>ob_get_clean()</code> eller <code>ob_get_flush()</code>. | Innehållet i den aktiva bufferten kan hämtas genom att anropa <code>[[ob_get_contents()]]</code>, <code>[[ob_get_clean()]]</code> eller <code>[[ob_get_flush()]]</code>. | ||
Om endast längden på buffertens innehåll behövs, kommer <code>ob_get_length()</code> eller <code>ob_get_status()</code> att returnera längden på innehållet i bytes. | Om endast längden på buffertens innehåll behövs, kommer <code>[[ob_get_length()]]</code> eller <code>ob_get_status()</code> att returnera längden på innehållet i bytes. | ||
''Varning:'' | ''Varning:'' | ||
Anrop av <code>[[ob_get_clean()]]</code> eller <code>[[ob_get_flush()]]</code> kommer att stänga av den aktiva bufferten efter att ha returnerat dess innehåll. | |||
''Varning:'' Anrop av <code>ob_end_clean()</code> eller <code>ob_get_clean()</code> kommer att stänga av den aktiva bufferten. | Innehållet i den aktiva bufferten kan rensas genom att anropa <code>ob_clean()</code>, <code>[[ob_end_clean()]]</code> eller <code>[[ob_get_clean()]]</code>. | ||
''Varning:'' Anrop av <code>[[ob_end_clean()]]</code> eller <code>[[ob_get_clean()]]</code> kommer att stänga av den aktiva bufferten. | |||
=== Stänga Av Buffertar === | === Stänga Av Buffertar === | ||
Utmatningsbuffertar kan stängas av genom att anropa <code>ob_end_clean()</code>, <code>ob_end_flush()</code>, <code>ob_get_flush()</code> eller <code>ob_get_clean()</code>. | Utmatningsbuffertar kan stängas av genom att anropa <code>[[ob_end_clean()]]</code>, <code>[[ob_end_flush()]]</code>, <code>[[ob_get_flush()]]</code> eller <code>[[ob_get_clean()]]</code>. | ||
''Varning:'' Utmatningsbuffertar som startats utan flaggan <code>PHP_OUTPUT_HANDLER_REMOVABLE</code> kan inte stängas av och kan generera en E_NOTICE. | ''Varning:'' Utmatningsbuffertar som startats utan flaggan <code>PHP_OUTPUT_HANDLER_REMOVABLE</code> kan inte stängas av och kan generera en E_NOTICE. |
Versionen från 11 oktober 2024 kl. 14.48
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.