Flush-systemets Buffertar

Från Wiki.linux.se
Hoppa till navigering Hoppa till sök

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.

VARNING

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.