Ob_flush требуется много времени для выполнения

На моем веб-сайте (работает с drupal) функция ob_flush занимает много времени (между 10 - 100 сек.), которая должна быть выполнена. Как узнать, почему? Что может вызвать это так долго? enter image description here

Ответ 1

Попробуйте следующее:

ob_start();
//Your code to generate the output
$result = ob_get_contents(); //save the contents of output buffer to a string
ob_end_clean();
echo $result;

Он работает быстро для меня.

Ответ 2

использовать

<?ob_start();?>

в начале страницы и

 <?ob_flush();?>

в конце страницы, чтобы решить эту проблему.

Ответ 3

SET

output_buffering = Off

в php.ini

Ответ 4

[Вы можете пометить свой вопрос с помощью Drupal, так как это похоже на проблему с Drupal. В частности, я подозреваю, что при сбросе буфера вы пишете внешний буфер, который вызывает тонну крючков, которые будут вызываться для фильтрации данных, которые вы только что записали.]

Я подозреваю, что ваша проблема - вложенные буферы. Drupal действительно любит буферы и буферизирует все по всему месту. Проверьте результат:

echo "<pre>\nBuffering level: ";
    . ob_get_level() .
    . "\nBuffer status:\n"
    . var_dump(ob_get_status(TRUE))
    . "\n</pre>";

Если у вас есть вложенные буферы, то я подозреваю, что ob_flush() ничего не сделает для вас: он просто добавляет содержимое вашего внутреннего буфера в следующий внешний уровень буферизации.

Вложенные буферы могут поступать из самого Drupal (что будет показано выше) или из настроек для zlib-output-compression и output_buffering (попробуйте свернуть их, посмотрите, не изменит ли это что-либо).

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

$data = ob_get_contents(); // Return the contents of the output buffer.
ob_clean(); // Clean (erase) the output buffer.
ob_end(); // Close the buffer.
echo($data); // Output our data - only works if there no outer buffer!
ob_start(); // Start our buffer again.

Затем возникает вопрос, "что вы пытаетесь выполнить?" Как вы думаете, что здесь делает ob_flush()? Потому что, если ответ "Я хочу нажать все, что я сделал до сих пор в браузере"... тогда я боюсь, что ob_flush() просто не так.