Испразнување на системските бафери
Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.
Испразнување на системските бафери
Референца за `outcontrol.flushing-system-buffers.php` со подобрена типографија и навигација.
Испразнување на системските бафери
PHP обезбедува два поврзани начини за исфрлање (испраќање и отфрлање на содржината на) системските бафери: преку повикување flush() и преку овозможување на имплицитно исфрлање со ob_implicit_flush() или implicit_flush php.ini setting.
Поведение на исфрлање на излезот
Со оневозможено имплицитно исфрлање, PHP ќе го исфрли излезот само кога flush() се повикува или кога скриптата завршува.
Со овозможено имплицитно исфрлање, PHP ќе се обиде да исфрли по секој блок од код што резултира со излез. Излезот во овој контекст е податок со ненулта должина што е:
-
надвор од
<?php ?>tags - отпечатено од јазични конструкции и функции чија експлицитна цел е да прикажуваат кориснички обезбедени променливи или низи како echo, print, printf(), var_dump(), var_export(), vprintf()
- отпечатено од функции чија цел е да собира и прикажува податоци/информации за тековната скрипта или PHP како debug_print_backtrace(), phpcredits(), phpinfo(), PHP-овите бафери за излез на ниво корисник ги баферираат сите излези откако ќе започнат додека не се исклучат или додека не заврши скриптата. Излезот во контекст на PHP-овите бафери за излез на ниво корисник е сè што PHP би прикажал или испратил назад до прелистувачот. Во практични услови, излезот е податок со должина различна од нула што е:
- отпечатено од PHP при нефатен исклучок или нетретирана грешка (предмет на поставките на display_errors and error_reporting)
-
сè што е напишано на
php://output
Забелешка: Печатењето празни низи или испраќањето заглавја не се смета за излез и нема да резултира со операција на исфрлање.
Ако е овозможено имплицитно исфрлање, контролните знаци (на пр. "\n", "\r",
"\0") исто така ќе предизвикаат исфрлање.
Ограничувања
Оваа функционалност не може да ги исфрли баферите за излез на корисничко ниво. За да ги користите овие заедно, баферите за излез на корисничко ниво мора да бидат исфрлени пред исфрлањето на системските бафери за PHP да произведе каков било излез.
Повикување flush() или овозможено имплицитно исфрлање може да се меша со ракувачите на излез на бафери за излез на корисничко ниво што поставуваат и испраќаат заглавја во веб контекст (на пр. ob_gzhandler()) со испраќање заглавја пред овие ракувачи да можат да го сторат тоа.
Баферирањето имплементирано од основната софтверска/хардверска опрема не може да се поништи од PHP и треба да се земе предвид при работа со функциите за контрола на бафери на PHP. Проверката на поставките за баферирање на веб серверите/прелистувачите/конзолите и работата со нив може да ги ублажи можните проблеми. Работејќи во веб контекст, или поставките за баферирање на веб серверот или баферирањето на скриптата може да се прилагодат за да работат во тандем, додека заобиколувањето на стратегиите за баферирање на разни прелистувачи може да се постигне со прилагодување на баферирањето во PHP скриптата. На конзолите што имплементираат баферирање по редови, знаците за нов ред може да се вметнат на соодветни места пред исфрлањето на излезот.
SAPI Разлики во исфрлањето
Иако исфрлањето се спроведува од секој SAPI на малку поинаков начин, овие имплементации спаѓаат во една од две категории:
-
SAPIs што се користат во веб контекст прво ќе ги исфрлат заглавјата, а потоа излезот.
Apache2Handler,CGI,FastCGIandFPMсе такви SAPIs -
other SAPIs како што се
CLIandembedќе го исфрли само излезот