Как правильно показывать вывод при каждом эхо во всех браузерах? - PullRequest
7 голосов
/ 16 марта 2011

Я переместил свои файлы на новый сервер, и у меня был скрипт, который мгновенно отображал вывод на каждый echo в браузер, но это не работает на новом сервере.Вот мой тестовый код:

@ini_set('output_buffering', 0); @ini_set('implicit_flush', 1);

for ($i = 0; $i < ob_get_level(); $i++) ob_end_flush();

ob_implicit_flush(1);

ignore_user_abort(true); set_time_limit(0);


$max_wait_time = 30;

$begin_time = microtime(true);

$elapsed_time = 0;


while(!connection_aborted()) {

    echo $i++.str_repeat(' ', 1020).'<br/>';

    flush(); ob_flush();

    usleep(1000000);

    if($elapsed_time > $max_wait_time){ break; }

    $elapsed_time++;

}

Я пробовал несколько вещей, которые стали выше.Но включение буферизации и очистки выходных данных мне не помогло.Я проверил это на Chrome и Firefox, они оба просто выводят все в конце.

Есть идеи?

Ответы [ 4 ]

13 голосов
/ 21 марта 2011

Выдержка из flush документации :

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

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

Серверные модули для Apache mod_gzip может делать буферизацию самостоятельно это приведет к тому, что flush () не приведет к в данных, отправляемых немедленно в клиент.

Скорее всего, вы перешли на другой веб-сервер (или конфигурацию веб-сервера), который буферизует вывод всего скрипта перед его выводом.

1 голос
/ 23 марта 2011

Параметр, который вы ищете, находится в вашем PHP.ini и называется output_buffering:

; output_buffering
;   Default Value: Off
;   Development Value: 4096
;   Production Value: 4096

Отключите его вручную и перезапустите веб-сервер, чтобы flush () действительно сбрасывал что-то, когда вы хотитеэто, не после 4 КБ данных:)

Обратите внимание, что ini_set не всегда должен работать для этого.Если вам нужен полный контроль, отключите его в самом php.ini или в виде флага .htacces php_value

0 голосов
/ 26 марта 2011

Попробуйте добавить в .htaccess

    php_value output_buffering Off
0 голосов
/ 20 марта 2011

Браузеры сами решают, когда выводить контент. Поэтому, если вы не достигнете этого порога, они просто подождут, пока он будет достигнут, и только потом покажут пользователю больше контента.

...