8

私が行っているプロジェクトの PHP の flush() 関数に慣れようとしています。自分でいくつかのスクリプトを作成し、所有する Web スペースにアップロードしました。しかし、それらのどれも機能していないようでした。PHP.netのコメントから以下のものを選んで試しました:

<?php
header( 'Content-type: text/html; charset=utf-8' );

echo 'Begin ...<br />';
for( $i = 0 ; $i < 10 ; $i++ )
{
    echo $i . '<br />';
    flush();
    sleep(1);
}
echo 'End ...<br />';

どうやらスクリプトはまだ機能していませんでした。

次に、次のようなコメントを読みました。

ob_flush() と flush() を呼び出してもバッファがフラッシュされない場合は、一部のウイルス対策ソフトウェア (この場合は Panda) が、ブラウザに送信する前にページの読み込みが完了するまでバッファを保持している可能性があります。

そのため、ウイルス対策ソフトウェアがインストールされていない Linux (Ubuntu 12.04) を使用しているマシンで Web ページを要求することにしました。そしてそれは完璧に機能しました!

これがウイルス対策ソフトウェアと関係があるかどうかはわかりませんか?または、flush() が意図した目的を達成するのを妨げている Windows の他の奇妙なメカニズムです。私は両方のマシン (Firefox 14.0.1) で同じブラウザーを使用しているので、そうであるとは思えません。

したがって、私の本当の質問は次のとおりだと思います: ウイルス対策ソフトウェアが flush() が意図した目的を達成するのを妨げていることについて何か知っている人はいますか? もしそうなら、それを回避する方法はありますか?

編集:明確にするために、これはサーバー側ではないことを確信しています。Linuxを実行している外部Webサーバーがあり、これらのスクリプトをLinuxまたはWindowsマシンでローカルにホストしていません。

EDIT2:Linuxラップトップで友人の家でこれを試してみましたが、奇妙なことに、フラッシュコードも彼らの家では機能しませんでした(代わりに、ロードに時間がかかり、すべてが私の家のこのラップトップで動作するので奇妙です.ルーターがflush()関数の動作と関係があるかどうかはわかりません(Web上でこれについて何も見つけることができません).私が考えることができる唯一のことは、それを妨げる可能性があります。

それ以外の場合、私は自分でこれを回避しようとして進歩を遂げていません。これは間違いなくサーバー側とは関係ありません。私が見つけたように見えるほとんどの情報は、flush()関数が機能していません:/

偶然にも、家でノートン (AVG の代わりに) を実行している PC でこれを試してみましたが、うまくいきましたが、100% ではありませんでした。

4

1 に答える 1

4

出力がすぐに表示されない原因には、次のようなものがあります。

  • PHP 内からのバッファリング (これがflush妨げになります)
  • 圧縮するのに十分なデータを蓄積するためのバッファリング (圧縮が有効な場合)
  • Web サーバーでのバッファリング (何らかの理由でそうすることが決定される場合があります)
  • ブラウザー内でのバッファリング (ブラウザーはさまざまな手法を使用して、エンド ユーザーがページの読み込みを「速く感じる」ようにします。これらの手法には、コンテンツが利用可能になるとすぐにコンテンツが表示されるとは限りません)

このflushリストのすべてを制御することはできないため、プログラムが期待どおりに動作するという保証はありません。

これらはすべて、次の注記に記載されていますflush

PHP および PHP が使用しているバックエンド (CGI、Web サーバーなど) の書き込みバッファーをフラッシュします。これは、現在の出力をブラウザーにプッシュしようとしますが、いくつかの注意事項があります。

flush() は、Web サーバーのバッファリング スキームをオーバーライドできない可能性があり、ブラウザのクライアント側のバッファリングには影響しません。また、PHP のユーザー空間出力バッファリング メカニズムにも影響しません。これは、ob_flush() と flush() の両方を呼び出して、ob 出力バッファーを使用している場合、それらをフラッシュする必要があることを意味します。

いくつかのサーバー、特に Win32 では、結果をブラウザーに送信する前にスクリプトが終了するまで、スクリプトからの出力を引き続きバッファーします。

mod_gzip のような Apache 用のサーバー モジュールは、独自のバッファリングを行う場合があり、これにより、flush() によってデータがクライアントにすぐに送信されなくなります。

ブラウザでさえ、入力を表示する前にバッファリングすることがあります。たとえば、Netscape は、行末またはタグの開始を受け取るまでテキストをバッファリングし、最も外側のテーブルのタグが表示されるまでテーブルをレンダリングしません。

Microsoft Internet Explorer の一部のバージョンは、256 バイトの出力を受信した後にのみページの表示を開始するため、フラッシュする前に余分な空白を送信して、それらのブラウザーにページを表示させる必要がある場合があります。

于 2012-08-05T13:36:05.027 に答える