Vad buffras i utmatningen?: Skillnad mellan sidversioner
Admin (diskussion | bidrag) |
Admin (diskussion | bidrag) |
||
Rad 1: | Rad 1: | ||
== | == 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 | |||
''Observera:'' | 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 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 <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.