Ob get flush: примеры (PHP)

Использование ob_get_flush для буферизации вывода в PHP
Раздел: Буферизация вывода
ob_get_flush: string|false
Функция ob_get_flush

Функция ob_get_flush() в PHP выполняет две операции: возвращает содержимое текущего буфера вывода и одновременно сбрасывает его (отправляет в браузер или следующему обработчику в цепочке буферизации). Это эквивалентно последовательному вызову ob_get_contents() и ob_end_flush().

Когда используется

Использование актуально при необходимости получить содержимое буфера для дальнейшей обработки (например, для сохранения в файл, отправки по электронной почте или дополнительной модификации) с одновременной отправкой его на вывод. Типичные сценарии включают генерацию HTML-страниц, кэширование вывода или перехват содержимого перед отправкой.

Аргументы функции

Функция не принимает параметров.

Примеры использования
Базовый пример

Получение и сброс буфера:

<?php
ob_start();
echo "Содержимое буфера.";
$content = ob_get_flush(); // Выводит содержимое и возвращает его в переменную
echo "Буфер был: " . $content;
?>
Содержимое буфера.
Буфер был: Содержимое буфера.
Использование с уровнями буферизации

Функция работает с текущим активным буфером:

<?php
ob_start();
echo "Внешний буфер. ";
ob_start();
echo "Внутренний буфер. ";
$inner = ob_get_flush(); // Сброс внутреннего буфера
echo "\nВернулось: '" . $inner . "'";
$outer = ob_get_flush(); // Сброс внешнего буфера
?>
Внутренний буфер. 
Вернулось: 'Внутренний буфер. '
Внешний буфер. 
Похожие функции в PHP

Возвращает содержимое текущего буфера вывода без его сброса. Позволяет обработать данные, не отправляя их на вывод. Используется, когда содержимое нужно проанализировать или сохранить, но не выводить немедленно.

Сбрасывает текущий буфер вывода и отключает буферизацию, но не возвращает содержимое. Применяется, когда требуется только отправить данные без их получения в скрипте.

Возвращает содержимое текущего буфера и удаляет его без отправки на вывод. Полезен для сбора сгенерированного содержимого (например, для шаблонов) без фактического вывода.

Выбор функции

ob_get_flush выбирается для одновременной отправки данных и получения их копии. ob_get_contents подходит для получения данных без вывода. ob_end_flush используется только для отправки. ob_get_clean применяется для получения данных без отправки.

Аналоги в других языках

Ob get flush в Python

Аналогом может быть использование io.StringIO для буферизации вывода:

import io
import sys

buffer = io.StringIO()
sys.stdout = buffer
print("Содержимое буфера.")
sys.stdout = sys.__stdout__
content = buffer.getvalue()
print(content, end="")
Содержимое буфера.
JavaScript (Node.js)

В Node.js можно перенаправить вывод console.log:

const originalLog = console.log;
let buffer = "";
console.log = (msg) => { buffer += msg + "\n"; };
console.log("Содержимое буфера.");
console.log = originalLog;
process.stdout.write(buffer);
Содержимое буфера.
Отличия от PHP

В Python и JavaScript аналоги не являются встроенными функциями буферизации вывода, а реализуются через подмену потока вывода. В PHP буферизация встроена на уровне языка, что делает её более удобной для управления выводом.

Типичные ошибки
Вызов без активного буфера

Если буферизация не была запущена, функция вернет false:

<?php
$result = ob_get_flush();
var_dump($result);
?>
bool(false)
Попытка использования после ob_end_clean()

Если буфер уже был очищен, функция не сможет получить данные:

<?php
ob_start();
echo "Текст";
ob_end_clean();
$content = ob_get_flush();
var_dump($content);
?>
bool(false)
Игнорирование возвращаемого значения

Ошибкой является предположение, что функция только выводит данные, без учёта возвращаемого значения:

<?php
ob_start();
echo "Данные";
ob_get_flush(); // Вывод произойдет, но данные не будут сохранены
// $content не содержит "Данные"
?>
Изменения в PHP 8

В PHP 8 не было внесено значительных изменений в поведение функции ob_get_flush(). Функция сохраняет обратную совместимость с предыдущими версиями. Однако, в PHP 8 усилилась строгость типов, что может повлиять на интеграцию с пользовательскими обработчиками вывода.

Расширенные примеры
Сохранение вывода в файл

Буферизация вывода страницы с одновременным сохранением в файл:

Пример php
<?php
ob_start();
?>
<html><body>
<h1>Отчет</h1>
<p>Сгенерировано: <?php echo date('Y-m-d H:i:s'); ?></p>
</body></html>
<?php
$html = ob_get_flush(); // Вывод в браузер
file_put_contents('report.html', $html); // Сохранение в файл
?>
Цепочка обработчиков

Использование нескольких буферов с обработкой:

Пример php
<?php
function callback($buffer) {
    return strtoupper($buffer);
}
ob_start('callback');
echo "текст в нижнем регистре";
$processed = ob_get_flush(); // Выводит "ТЕКСТ В НИЖНЕМ РЕГИСТРЕ" и возвращает его
?>
Динамическое сжатие вывода

Буферизация с включением сжатия, если поддерживается:

Пример php
<?php
ob_start();
if (extension_loaded('zlib') && !ini_get('zlib.output_compression')) {
    ob_start('ob_gzhandler');
}
echo "Большой объем данных...";
// Если сжатие активно, ob_get_flush вернет сжатые данные
$output = ob_get_flush();
?>
Обработка ошибок в буфере

Перехват вывода, включая сообщения об ошибках:

Пример php
<?php
ob_start();
trigger_error("Тестовая ошибка", E_USER_NOTICE);
echo "Обычный вывод";
$content = ob_get_flush(); // Содержит и вывод, и сообщение об ошибке
echo "\nБуфер содержал: " . htmlspecialchars($content);
?>

PHP ob_get_flush function comments

En
Ob get flush Flush the output buffer, return it as a string and turn off output buffering