ob_implicit_flush (), flush (), ob_flush () — не работает на удаленном сервере

Если я загружаю этот скрипт в chrome с моего локального сервера на XAMPP:

header("Content-Type:text/plain");

set_time_limit(0);

$max = 40;
for ($i = 0; $i < $max; $i++) {
$response = array(  'server time: ' . date("h:i:s", time()), 'progress' => round($i/$max*100));
echo json_encode($response);
ob_flush();
flush();
sleep(1);
}
ob_clean();

Это работает, как и следовало ожидать, каждую секунду страница отображает новый ответ.
Однако, когда я загружаю его на свой удаленный сервер (использующий ту же версию php), он ждет, пока весь скрипт завершит работу, прежде чем отобразит вывод.
На очень длинных скриптах он обновляет вывод каждые 30-60 секунд или около того.

Как видно из названия, я попытался использовать все различные функции сброса, но ничего не работает.
Вероятно, есть некоторая разница в php.ini моего локального сервера и моего удаленного сервера, но я не знаю, что именно.

Пожалуйста помоги.

—РЕДАКТИРОВАТЬ—

Я делал еще несколько испытаний. Я заметил, что он обновляется только каждые 4096 байт, что и является значением phi ini моего удаленного сервера для output_buffering.
Однако по какой-то причине, если я изменю output_buffering на ‘1’ или ‘off’, ничего не изменится. Это все еще только обновляет каждые 4096 байтов.

Я тестирую 2 одинаковых скрипта на разных серверах в одном браузере.

2

Решение

Я не учел nginx, у которого есть собственный выходной буфер.

Я просто добавил ‘header («X-Accel-Buffering: no»);’ в начало сценария php, и теперь все работает нормально.

7

Другие решения

Для меня добавление header('Content-Encoding: none'); сделал трюк. Это необходимо при использовании PHP-FPM.

5

Прежде чем вам нужно использовать ob_start () а также ob_end_clean (). И добавить заголовок Content-Length или же Transfer-Encoding: chunked, И проверьте, включен ли «implicit_flush» в вашем php.ini

Добавьте отступ для ответа. Проверьте этот код:

<?php

set_time_limit(0);
ob_start();

header('Content-Type: text/plain');

define("PADDING", 16);

//+padding
for($i=0;$i<PADDING;$i++){
//64 spaces (1 block)
echo str_repeat(' ', 64);
}

$max = 40;
for ($i = 0; $i < $max; $i++) {
$response = array(  'server time: ' . date("h:i:s", time()), 'progress' => round($i/$max*100));
echo json_encode($response);
ob_flush();
flush();
sleep(1);
}
ob_end_clean();

?>
-1
По вопросам рекламы [email protected]