Скидання (відправлення) системних буферів

Розробники PHP передбачили два взаємопов'язані способи скидання (відправлення та видалення вмісту) системних буферів: один — виклик функції flush(), інший - включення неявного скидання функцією ob_implicit_flush() або директивою implicit_flushв файле php.ini.

Коли неявне скидання вимкнено, PHP скидатиме висновок, лише коли викликана функція flush()или когда скрипт завершил работу.

При включеному неявному скиданні PHP намагатиметься скинути висновок після кожного кодового блоку, який виводить дані. Висновок у цьому контексті – це дані ненульової довжини, які:

  • написані за межами тегів<?php ?>
  • виводять мовні конструкції і функції, явна мета яких - виведення змін або рядків, як наприклад:echo print printf() var_dump() var_export() vprintf()
  • виводять функції, мета яких - збирання та виведення даних або інформації про запущений скрипт або PHP, як наприклад:debug_print_backtrace() phpcredits() phpinfo() ReflectionExtension::info()
  • виводить PHP за неперехопленого виключення або необробленої помилки (за умови, що включені директивиdisplay_errors і error_reporting) .
  • записують у потікphp://output

Зауваження: Друк порожніх рядків або надсилання заголовків не розглядається як висновок і не призведе до операції скидання.

Увага

Якщо неявне скидання увімкнено, керуючі символи (наприклад, «\n» «\r» «\0») також викликають скидання.

Обмеження

Функції скидання системних буферів не скидають користувацькі буфери виведення. Щоб використовувати системний та користувальницький буфери разом, користувацькі буфери виводу скидають перед скиданням системних буферів, щоб PHP вивів дані.

Увага

Не виключено ризик того, що виклик функції flush() або включене неявне скидання перешкодить обробникам буферів виводу користувача, що встановлює і відправляє заголовки у веб-контексті (наприклад, функція ob_gzhandler()), відправивши заголовки доти, як їх відправлять обробники.

Працюючи з функціями управління PHP-буфером враховують, що PHP не вміє перевизначати буферизацію, реалізовану базовими програмними чи апаратними засобами. Перевірка налаштувань буферизації веб-серверів, браузерів, консолей і робота з ними допомагають усунути проблеми, що виникають. При роботі у веб-контексті для спільної узгодженої роботи регулюють налаштування буферизації веб-сервера або буферизації скрипта, тоді як обійти стратегії буферизації веб-браузерів можна, налаштувавши буферизацію в PHP-скрипті. На консолях, що реалізують буферизацію рядків, символи нового рядка вставляють у потрібні місця перед викиданням.

Відмінності скидання в інтерфейсах SAPI

Хоча реалізації скидання у кожному інтерфейсі SAPI трохи різняться, ці реалізації потрапляють до однієї з категорій:

  • Інтерфейси SAPI у веб-контексті спочатку скинуть заголовки, а потім висновок. До таких SAPI відносятьсяApache2Handler CGI FastCGIиFPM
  • інші SAPI, наприкладCLIиembed, тільки скинуть висновок