На высоком уровне они, кажется, делают очень похожие вещи. Однако, когда я попытался реализовать их в своем приложении, все получилось не так, как я ожидал.

Что 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(), где выходной буфер обходит любую дополнительную обработку и идет прямо в браузер.