php flush не работает - PullRequest
       28

php flush не работает

2 голосов
/ 22 июля 2011

Мой промывочный механизм перестал работать, я не уверен почему.Сейчас я пытаюсь запустить простой пример сброса, но безуспешно:

echo "before sleep";
flush();
sleep(5);
echo "after sleep";

после некоторого чтения и понимания, что ngin x был установлен на моем сервере в последнее время, я попросил его отключить для моегодомен.(администратор сервера сказал, что он отключил его для этого конкретного домена)

также, я попытался отключить gzip, добавил эти строки в .htaccess

SetOutputFilter DEFLATE
SetEnv no-gzip dont-vary

также, попытался добавить их в мой файл php

ini_set('output_buffering','on');
ini_set('zlib.output_compression', 0);

ничего не помогает.он спит 5 секунд, а затем отображает все содержимое вместе.Я использовал его раньше и использовал также через выходной буфер (ob_start, ob_flush и т. Д., Теперь просто пытаюсь заставить работать самый простой пример)

Ответы [ 2 ]

0 голосов
/ 09 мая 2015
<?php
ini_set('zlib.output_handler', '');
ini_set('zlib.output_compression', 0);
ini_set('output_handler', '');
ini_set('output_buffering', false); 
ini_set('implicit_flush', true); 
apache_setenv( 'no-gzip', '1' );


for($i = 0; $i < 5; $i++){
    echo str_repeat(chr(0), 4096); #flood apache some null bytes so it feels the packet is big enough to be sent...
    echo "$i<br/>";
    flush();
    sleep(1);
}
?>
0 голосов
/ 22 июля 2011

«Перестал работать» - это довольно высокий уровень. Вы должны посмотреть, что работает или нет, чтобы узнать больше.

Это можно сделать путем мониторинга сетевого трафика. Вы увидите, сколько ответа уже выполнено и в какой кодировке оно отправлено.

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

Если вы не хотите отслеживать свой сетевой трафик, утилита командной строки curl отлично справляется с задачей, отображая происходящее, и ее может быть проще использовать вместо мониторинга сети.

curl -Ni --raw URL

Убедитесь, что вы используете переключатель -N, который отключит буферизацию на curl, чтобы вы могли напрямую видеть вывод ваших скриптов / серверов.

См. Раздел Проверка проблем сжатия HTTP с помощью Curl в моем предыдущем ответе, где показаны некоторые команды curl для просмотра вывода запроса, пока он выполняется с также сжатие.

curl может показать, что сжатые данные в конечном итоге будут сжаты без сжатия, и вы можете отключить сжатие для каждого запроса, поэтому независимо от настроек сжатия сервера или PHP, вы можете протестировать более дифференцированные.

...