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 utdata 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, såsom `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` och `error_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.
Warning
Om implicit flushing är aktiverat kommer kontrolltecken (t.ex. `"\n"`, `"\r"`, `"\0"`) också att trigga flushing.
Limitations
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.
Warning
Att anropa `flush()` eller ha implicit flushing aktiverat kan störa output handlers för användarnivåns utdata buffrar som sätter och skickar headers i en webbkontext (t.ex. `ob_gzhandler()`) genom att skicka headers innan dessa hanterare kan göra det.
Begränsningar
Buffring implementerad av den underliggande mjukvaran/hårdvaran kan inte åsidosättas av PHP och bör beaktas när du arbetar med PHP:s buffertkontrollfunktioner. Att kontrollera webbservrar/webbläsare/konsolers buffertinställningar och arbeta med dessa kan lindra möjliga problem. Vid arbete i en webbkontext kan antingen webbserverns buffertinställningar eller skriptets buffring justeras för att arbeta i takt, medan arbete runt buffringsstrategierna hos olika webbläsare kan uppnås genom att justera buffringen i PHP-skriptet. På konsoler som implementerar radbuffring kan nyradstecken infogas på lämpliga ställen innan utdata spolas.
SAPI Differences In Flushing
Även om flushing implementeras på olika sätt för varje SAPI, faller dessa implementationer in i en av 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.