Flush-systemets Buffertar: Skillnad mellan sidversioner
Admin (diskussion | bidrag) Ingen redigeringssammanfattning |
Admin (diskussion | bidrag) |
||
(En mellanliggande sidversion av samma användare visas inte) | |||
Rad 15: | Rad 15: | ||
* Allt som skrivs till `php://output` | * 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 === | === Warning === | ||
Rad 25: | Rad 25: | ||
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. | 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. | 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. | ||
Rad 37: | Rad 37: | ||
Även om flushing implementeras på olika sätt för varje SAPI, faller dessa implementationer in i en av två kategorier: | Ä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. |
Nuvarande version från 11 oktober 2024 kl. 14.17
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.