2015-09-12 7 views
2

Если я загрузить этот скрипт в хроме с моего локального сервера на XAMPP:ob_implicit_flush(), Flush(), ob_flush() - не работает на удаленном сервере

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 моего локального сервера и моего удаленного сервера, но я не знаю, что.

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

--- EDIT ---

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

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

+0

[doc-страница 'flush()'] (http://php.net/manual/en/function.flush.php) полна отказов от того, почему это может или не может работать. Это может быть то, что вы даже не можете исправить. – GolezTrol

+0

Скорее всего, Apache буферизует выход ..... это не эффективный механизм для использования для таймера. –

+0

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

ответ

5

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

Я просто добавил 'header ("X-Accel-Buffering: no");' на вершине php-скрипта, и теперь все работает отлично.

0

Прежде чем вы будете нуждаться в использовании 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(); 

?> 
+0

Пробовал. Все такой же. – hedgehog90

+0

Вы используете локальный сервер с apache и удаленным сервером nginx + apache? Я думаю, вам нужно посмотреть, как настроить nginx – korytoff

3

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

 Смежные вопросы

  • Нет связанных вопросов^_^