1

この単純なスクリプトがブラウザに毎秒数値を出力する場所で正常に動作するubuntuテストサーバーがあります

<?
    for ($i=0; $i<3; $i++) 
    {
        echo $i.'<br>';
        flush();
        sleep(1);
    }

ただし、私のローカル開発ボックス (Windows 環境) では動作しません。3 秒後にすべて出力されます。

テストサーバーとして、ローカルボックスで同じphpバージョン(5.3.13)とapache(2.2.22)バージョンを使用しています。php.ini と httpd.conf の両方の設定のほとんどをミラーリングしました。設定した設定は次のとおりです (テスト サーバーと同じです)。

output_buffering 0
zlib.output_compression = Off
zlib.output_compression_level = -1

mod_gzip がインストールされていません。

私は自分のボックスにワンプをインストールしようとさえしましたが、それでもうまくいきませんでした。

テストサーバーでスクリプトを表示するためにまったく同じブラウザーを使用しているため、クライアント(ブラウザー-firefox 13)の問題であるとは想像できませんが、正常に動作します

暗黙的なフラッシュを有効にしたり、ob_flush を実行したりしましたが、うまくいきません。

これを機能させる方法について誰かアイデアがありますか?

4

2 に答える 2

3

@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);
}
?>
于 2012-06-28T21:41:31.560 に答える
1

私は自分の問題の解決策を見つけました。何らかの理由で行を追加する

default_charset = "utf-8"

私のphp.iniにはそれが機能します。行を削除することを確認しました。フラッシュが機能しませんでした。それを追加し、それは機能しました。おそらく、ブラウザのバッファに十分な量のヘッダーを追加するためです。

于 2012-06-29T01:13:01.890 に答える