Системный буфер
Это такой буфер вывода, который наполняется по ходу выполнения скрипта и отправляется в браузер по окончанию выполнения. Данный буфер вывода есть всегда, его не нужно создавать, но мы можем им управлять.
Давайте рассмотрим реализацию. Вызвав функцию flush()
, даем указание PHP сбросить системный буфер, отправив всё что там есть в браузер пользователю. Если ранее стартовал пользовательский буфер, для начала надо будет сбросить пользовательский буфер, а потом вызвать flush()
:
// выводим информацию
echo "<h3>Пожалуйста, подождите 10 секунд...</h3>";
// цикл на 10 итераций
for ($i = 1; $i <= 10; $i++) {
// выводим число, вывод попадает в системный буфер
echo $i;
// отправляем буфер пользователю в браузер
flush();
// ждём секунду между итерацией
sleep(1);
}
// выводим информацию
echo "<h3>Thx!</h3>";
Особенность о которой нужно помнить, директива implicit_flush
, отвечает за то, чтобы после каждого вывода автоматически вызывалась функция flush()
, поэтому следующая комбинация сработает аналогично предыдущему примеру:
.htaccessphp_flag implicit_flush on
for ($i = 1; $i <= 10; $i++) {
echo $i;
sleep(1);
}
Директиву implicit_flush
можно изменять на лету, для этого достаточно вызвать функцию ob_implicit_flush()
, данная функция не имеет к пользовательскому буферу вывода отношения:
// включаем директиву implicit_flush
ob_implicit_flush();
// цикл на 10 итераций
for ($i = 1; $i <= 10; $i++) {
// после echo будет автамотически вызвана функция flush()
echo $i;
// ждём секунду между итерацией
sleep(1);
}
Данный пример работает только при выключенной директиве output_buffering
, иначе нужно будет его принудительно выключить и очистить в самом скрипте. Если же вы работаете в CLI, то знайте implicit_flush
всегда включён, а output_buffering
выключен, следовательно весь вывод будет без промедления попадать в консоль.