Я думал, flush();
будет работать, по крайней мере, из того, что скажет мне Google / Stackoverflow, но на моей системе Windows WAMP (Windows, Apache, MySQL, PHP) она не работает.
Есть ли какая-то настройка PHP, которую я должен настроить для работы flush ()?
Вот мой код:
<?php echo "Fun"; flush(); sleep(5); echo "<br>Mo"; ?>
Код просто выводит все вместе, когда скрипт выполняется (через 5 секунд). Я не хочу этого, я хочу, чтобы «Fun» появился сразу, а затем через 5 секунд «Mo».
Я пробовал другие комбинации flush как ob_end_flush();
or ob_implicit_flush(true);
но ничего не работает. Есть идеи?
Скрипт отлично работает с CLI, отображая «Fun», ожидая 5 секунд перед отображением «Мо».
Для браузера результаты могут быть немного разными, потому что:
Для работы 1) используйте тип текста / обычного контента для вашего теста; 2) нужны символы новой строки, так что echo "Fun\n";
и echo "<br>Mo\n";
Конечно, вы не будете использовать text / plain для реальных данных HTML.
Вот что я узнал:
Флеш не работал бы с помощью apache mod_gzip или gzip от Nginx, потому что, по логике, это gzipping содержимое, и для этого он должен буферизовать контент, чтобы его gzip. Любой вид gzipping веб-сервера повлияет на это. Короче говоря, на стороне сервера нам нужно отключить gzip и уменьшить размер буфера fastcgi. Так:
В php.ini:
, output_buffering = Off
, zlib.output_compression = Off
В nginx.conf:
, gzip off;
, proxy_buffering off;
Также имейте это в виду, особенно если у вас нет доступа к php.ini:
@ini_set ( 'zlib.output_compression', 0);
@ini_set ( 'implicit_flush', 1);
@ob_end_clean ();
set_time_limit (0);
Наконец, если у вас есть это, выполните приведенный ниже код:
ob_start ( 'ob_gzhandler');
ob_flush ();
Код проверки PHP:
ob_implicit_flush(1); for($i=0; $i<10; $i++){ echo $i; //this is for the buffer achieve the minimum size in order to flush data echo str_repeat(' ',1024*64); sleep(1); }
Если вы используете CGI / FastCGI, забудьте об этом! Они не реализуют флеш. У Web-сервера может быть собственный буфер.
Вы можете отключить всю буферизацию вывода в PHP с помощью следующей команды:
ob_implicit_flush();
Если проблема не устранена, хотя вы явно задали
implicit_flush = yes
в вашем php.ini вы также можете установить
output_buffering = off
который сделал трюк в моем случае (после того, как потянул мои волосы на 4 + hrs)
Проверьте ваш php.ini для output_buffering
.
Возможно, проблема здесь в Apache, которая также может иметь буферы …