ループが実行されるたびにエコーすることは可能ですか?例えば:
foreach(range(1,9) as $n){
echo $n."\n";
sleep(1);
}
ループが終了したときにすべてを出力するのではなく、時間ごとに各結果を出力することを確認します。
最終的解決
それが私が見つけたものです:
Flushは、Apacheのmod_gzipまたはNginxのgzipでは機能しません。これは、論理的にはコンテンツをgzipしているため、コンテンツをバッファーに入れてgzipする必要があるためです。あらゆる種類のWebサーバーgzippingがこれに影響します。つまり、サーバー側では、gzipを無効にし、fastcgiバッファーサイズを小さくする必要があります。そう:
Php.iniで:
。 output_buffering = Off
。 zlib.output_compression =オフ
Nginx.conf:
。 gzipオフ;
。 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);
}
関連:
Nginxのバッファリングを排除する最も簡単な方法は、ヘッダーを発行することです。
header('X-Accel-Buffering: no');
これにより、両方のproxy_buffering
および(nginx> = 1.5.6の場合)、fastcgi_buffering
。 php-fpmを使用している場合、fastcgiビットは重要です。また、ヘッダーは必要に応じて実行する方がはるかに便利です。
Nginxサーバーでの簡単なソリューション:
fastcgi_keep_conn on; # < solution
proxy_buffering off;
gzip off;
サーバー全体またはディレクトリ全体でgzipをオフにする必要はありませんでした。いくつかの特定のケースでは、いくつかのスクリプトだけでした。
何かがエコーされる前に必要なのはこれだけです:
header('Content-Encoding: none;');
次に、通常どおりフラッシュを実行します。
ob_end_flush();
flush();
Nginxはオフになっているエンコーディングを取得するようで、gzipしません。
PHPのバッファをブラウザにフラッシュする必要があります
foreach(range(1,9) as $n){
echo $n."\n";
flush();
sleep(1);
}
あなたが設定できることがわかりました:
header("Content-Encoding:identity");
pHPスクリプトで、nginx.conf
を変更せずにnginx gzippingを無効にする
これは、ループの途中で出力バッファーをフラッシュすることで実現できます。
例:
ob_start();
foreach(range(1,9) as $n){
echo $n."\n";
ob_flush();
flush();
sleep(1);
}
Php.iniの設定は、zlib圧縮をオンにしている場合、これが機能するかどうかに影響する可能性があることに注意してください。
私のphp-fpmエンジンからgzipの問題が発生しました。このコードは私のために働いている唯一のものです:
function myEchoFlush_init() {
ini_set('zlib.output_compression', 0);
ini_set('output_buffering', 'Off');
ini_set('output_handler', '');
ini_set('implicit_flush', 1);
ob_implicit_flush(1);
ob_end_clean();
header('Content-Encoding: none;');
}
function myEchoFlush($str) {
echo $str . str_repeat(' ', ini_get('output_buffering') * 4) . "<br>\n";
}
これは私のテスト関数です:max_execution_timeをチェックします:
public function timeOut($time = 1, $max = 0) {
myEchoFlush_init();
if ($max) ini_set('max_execution_time', $max);
myEchoFlush("Starting infinite loop for $time seconds. It shouldn't exceed : " . (ini_get('max_execution_time')));
$start = microtime(true);
$lastTick = 1;
while (true) {
$tick = ceil(microtime(true) - $start);
if ($tick > $lastTick) {
myEchoFlush(microtime(true) - $start);
$lastTick = $tick;
}
if ($tick > $time) break;
}
echo "OK";
}