@Wrikkenが言ったことを覚えておいてください。これはお勧めできません。
だから私は考えていました、あなたがしていることはすべて正しいようです. セットアップをコピーして試しました。私は同じ問題に直面しました。コマンドラインからスクリプトを実行したところ、うまくいきました。
次に、最後のテストである Wireshark を実行する必要がありました。最初の数パケットの後、サーバーがすべてを正しく送信していることは明らかだったので、ブラウザのバッファである必要がありました。
それで、ループの前にいくつかのデータを送信しようとしましたが、何だと思いますか? 出来た!
どうぞ:
<?php
ini_set('output_buffering','off');
ini_set('zlib.output_compression', 0);
echo str_repeat(" ", 1024), "\n";
for($i=0;$i<6;$i++) {
echo $i."<br />\n";
ob_flush();
flush();
sleep(1);
}
?>
あなたが念頭に置いているアプリケーションについてはわかりませんが、これは明らかに良い考えではありません。他のオプションを検討することを強くお勧めします.
更新:
長いGoogle検索の後、これとこれを見つけました
ブラウザーは、ページの文字を構成する方法を知らずにページを正しくレンダリングできないため、ほとんどのブラウザーは、JavaScript を実行したりページを描画したりする前に、特定のバイト数をバッファーします。
と
これらの遅延を回避するには、1 KB (正確には1024 バイト。これは、テストしたブラウザーのいずれかで使用される最大バッファー制限です) を超える HTML ドキュメントに対して、できるだけ早く文字エンコーディングを常に指定する必要があります。
そこで、バッファを埋める代わりに最初に文字セットを送信しようとしました: (そしてそれはうまくいきました)
<?php
ini_set('output_buffering','off');
ini_set('zlib.output_compression', 0);
//echo str_repeat(" ", 1024), "\n";
header('Content-Type: text/html; charset=iso-8859-1');
//Note that it shoudn't matter which charset you send
for($i=0;$i<6;$i++) {
echo $i."<br />\n";
ob_flush();
flush();
sleep(1);
}
?>
では、なぜ最初のサーバーでは機能していたのに、2 番目のサーバーでは機能しなかったのでしょうか?
おそらく、最初のサーバーがヘッダー付きの文字セットを送信しているのに、2番目のサーバーは送信していないためです。
ただし、あなたの場合、次の変更を加えます
<?php
ini_set('output_buffering','off');
ini_set('zlib.output_compression', 0);
//Plain text MIME type since you'll use for logging purposes
//and if you run it from CLI, you can ignore the whole header line
header('Content-Type: text/plain; charset=iso-8859-1');
for($i=0;$i<6;$i++) {
//No need to echo <br /> once you'll run it from CLI
echo $i."\n";
ob_flush();
flush();
sleep(1);
}
?>