На высоком уровне они, кажется, делают очень похожие вещи. Однако, когда я попытался реализовать их в своем приложении, все получилось не так, как я ожидал.
Что W3 говорит об использовании ob_flush()
Функция
ob_flush()
выводит содержимое самого верхнего выходного буфера, а затем очищает буфер от содержимого. Вывод может быть перехвачен другим буфером вывода или, если других буферов вывода нет, отправлен непосредственно в браузер.
Что W3 говорит об использовании flush()
Функция
flush()
запрашивает у сервера отправку текущего буферизованного вывода в браузер. Конфигурация сервера не всегда позволяет это сделать.
Не вдаваясь в подробности, они оба звучат так, как будто делают очень похожие вещи. Самая большая разница, по-видимому, заключается в том, что ob_flush() очищает буфер вывода от его содержимого, так как flush() очищает буферы записи PHP.
Что такое буферы вывода и записи?
Выходные буферы используются PHP для хранения выходных данных, сгенерированных сценарием PHP, перед их отправкой в браузер. Это дает нам дополнительную возможность манипулировать выводом до того, как он будет отправлен в браузер.
Например:
<?php // Start output buffering ob_start(); // Generate output echo "Hello, JavaScript!"; // Filter the output $output = ob_get_contents(); $output = str_replace("JavaScript", "PHP", $output); // End output buffering and send output to browser ob_end_flush(); ?>
В приведенном выше примере мы изменили выходной PHP-код JavaScript с помощью слова PHP.
Буферы записи используются для временного хранения данных, которые выдают PHP-скрипты. Буфер записи используется для повышения производительности.
Например
<?php // Generate output echo "Hello, Foo!"; // Flush the write buffer flush(); // Generate more output echo "Goodbye, dawg!"; ?>
В приведенном выше примере мы разделили строку «Hello, Foo» и «Goodbye, Dawg». Сбрасывая буфер записи с помощью функции сброса, мы можем немедленно выдать строку «Hello, Foo» в браузер, поскольку файл PHP продолжает выполнять файл и, наконец, достигает «Goodbye, dawg».
Когда следует выбирать между флешем и ob_flush()?
Что ж, как и во всем программировании, контекст имеет значение, но по сути он зависит от буфера, который вы пытаетесь отправить клиенту.
В некоторых случаях вам нужно будет вызвать обе функции, одну сразу за другой.
Пример
<?php // Turn on output buffering ob_start(); // Get Partial getSection("loader.php"); // cURL call can open here // Flush the output buffer and system write buffers. AKA send partial to the client ob_flush(); flush(); getSection("section1.php"); getSection("section2.php"); getSection("section3.php"); // Turn off output buffering ob_end_flush(); ?>
В приведенном выше примере файл loader.php — это первое, что отправляется в браузер.
Зачем нам нужны ob_flush() и flush()?
Иногда очистки выходного буфера недостаточно. Данные могут по-прежнему проходить промежуточный этап через PHP или веб-сервер, прежде чем они будут окончательно отправлены в браузер. Чтобы обеспечить отправку данных в браузер как можно скорее, вы можете использовать ob_flush()
в сочетании с flush()
для обеспечения отправки буфера записи. Подводя итог, ob_flush()
может быть включена дополнительная буферизация или сжатие, поэтому сценарий может по-прежнему зависать, пока не будет выполнена вся обработка. В отличие от flush()
, где выходной буфер обходит любую дополнительную обработку и идет прямо в браузер.