28.7. Буферизация вывода
Буферизация вывода - это новая возможность, добавленная в PHP 4. Возможность буферизации позволяет PHP направлять вывод из приложений в буфер памяти вместо непосредственной отправки в браузер клиента. А приложения имеют возможность обрабатывать вывод, находящийся в буфере. Это может быть сжатие, преобразование из формата XML в формат HTML и даже изменение вложенных URL. После этого приложение выводит полученные результаты в браузере.
Даже если необходимости в обработке вывода приложений нет, буферизация вывода позволяет улучшить рабочие характеристики Web-узлов, разработанных с помощью PHP, за счет уменьшения количества операций ввода-вывода на инфраструктуре Web-сервера. Обращение к уровню операций ввода-вывода обычно является дорогой операцией. Сбор вывода в один большой блок и выполнение одной операции ввода-вывода пройдет значительно быстрее, чем выполнение операции ввода-вывода при каждом выводе PHP, т.е. при каждом вызове функции print или echo.
Если сценарии PHP выводят HTML-страницы объемом больше 10 Кбайт, выделение памяти под буфер может потребовать больше времени, чем будет сэкономлено за счет уменьшения числа вызова операций ввода-вывода. Как и во многих других случаях, в вычислительной науке лучших характеристик можно добиться за счет баланса между отсутствием буферизации и полной буферизацией. К счастью, уровень буферизации вывода PHP позволяет пользователям добиться такого баланса. Вместо буферизации всего вывода можно задать буферизацию определенными порциями, которая ограничивает количество буферизируемых данных определенным значением и сбрасывает буфер при каждом его переполнении. Оптимальным значением является значение, равное 4 Кбайт. Такое значение существенно уменьшает количество операций ввода-вывода и работает без существенного расхода памяти или накладных расходов на выделение памяти под буфер. Например, если средний размер созданной PHP HTML-страниицы Web-узла составляет 50 Кбайт, PHP осуществляет 500-10000 вызовов операции ввода-вывода. Если размер буфера составляет 4 Кбайт, он выполнит 12-13 вызовов операции ввода-вывода.
Для того чтобы отвести под буфер всего Web-узла 4 Кбайт, задайте в директиве output_buffering значение 4096. Если необходимо задать буферизацию вывода для одного отдельно взятого сценария, воспользуйтесь функцией ob_start. Например, для задания буфера объемом 4 Кбайт, можно воспользоваться функцией ob_start(null, 4096).