Flush-systemets Buffertar
Flushing System Buffers
PHP tillhandahåller två relaterade sätt att spola (skicka och ta bort innehållet i) systembuffrar: genom att anropa flush() och genom att aktivera implicit flushing med ob_implicit_flush() eller inställningen implicit_flush i php.ini.
Output Flushing Behaviour
När implicit flushing är inaktiverat kommer PHP endast att spola utgången när flush() anropas eller när skriptet avslutas.
När implicit flushing är aktiverat kommer PHP att försöka spola efter varje kodblock som resulterar i utdata. Utdata i detta sammanhang är data med icke-noll längd som:
- finns utanför
<?php ?>
-taggarna - skrivs ut med språkkonstruktioner och funktioner vars explicita syfte är att skriva ut användarvariabler eller strängar, som t.ex.
echo
,print
,printf()
,var_dump()
,var_export()
,vprintf()
- skrivs ut av funktioner vars syfte är att samla in och skriva ut data/information om det körande skriptet eller PHP, såsom
debug_print_backtrace()
,phpcredits()
,phpinfo()
,ReflectionExtension::info()
- skrivs ut av PHP vid ett ohanterat undantag eller ett ohanterat fel (beroende på inställningarna för
display_errors
ocherror_reporting
) - allt som skrivs till
php://output
Notera: Att skriva ut tomma strängar eller skicka headers anses inte vara utdata och kommer inte att resultera i en spolningsoperation.
Begränsningar
Denna funktionalitet kan inte spola användarnivåns utdata buffrar. För att använda dessa tillsammans måste användarnivåns utdata buffrar spolas innan systembuffrarna för att PHP ska producera någon utdata.
Skillnader i SAPI-flushing
Även om flushing implementeras på olika sätt för varje SAPI, faller dessa implementationer in i två kategorier:
- SAPIs som används i en webbkontext kommer först att spola headers följt av utdata. Apache2Handler, CGI, FastCGI och FPM är sådana SAPIs.
- Andra SAPIs, såsom CLI och embed, spolar endast utdata.