0

重複の可能性:
出力バッファリングとは何ですか?

PHPによって生成されるのに時間がかかるコンテンツがいくつかあります。その間、この単純なJSトリックを使用して、「Loading...」メッセージを表示したいと思います。出力が生成されるとすぐにメッセージは消えます。

<p id="loading_msg">Loading...</p>

<h1>Hello</h1>
<?php
    sleep(2); // This is the greedy function call
    print '<p>This content definitely took a while to be generated !.</p>';
?>

<script type="text/javascript">
    var e = document.getElementById("loading_msg");
    e.style.display = "none";
</script>

問題は、sleep(2);それまですべてを送信してブロックするのではなく、すべてのページが生成されるまで待機してから一度にすべてを送信することです。2秒が経過する前に表示されないため、「Loading...」メッセージの目的が明らかに壊れています。理由と、これを回避する方法についてのアイデアはありますか?

4

2 に答える 2

4

デフォルトでは、PHP は出力をバッファリングし、少数の大きなチャンクをユーザーに送信します。flushすぐに書き込みバッファの内容をユーザーに送信するために使用できます。

<p id="loading_msg">Loading...</p>

<h1>Hello</h1>
<?php
    flush();
    sleep(2);

ob_startを呼び出すか、または php.ini ディレクティブoutput_bufferingを使用して出力バッファリングを以前に有効にした場合、これは機能しません1

于 2012-07-18T15:19:45.127 に答える
1

'flush'を使用すると、一部のWebサーバー/ブラウザーで機能する場合があります(meagarは、出力バッファリングが有効になっている間は機能しないということは正しいですが、それ以外の時間は機能するという意味ではありません)。

チャンクエンコーディングにいつ戻すかはWebサーバー次第です。出力ストリームを圧縮していない限り、flushを呼び出すと、ほとんどの場合チャンク応答が開始されます。次に、不完全な応答のレンダリングをいつ開始するかを決定するのはブラウザの責任であり、動作はコンテンツによっても異なります。たとえば、終了タグが付けられるまでテーブルのレンダリングを開始するものはありません。

受信ページで処理しようとするよりも良い解決策は、送信ページで処理することです。たとえば、ライトボックスを使用してメッセージを表示します。あるいは、生成されたコンテンツへのリダイレクトを行う中間ページにメッセージを表示することもできます。

于 2012-07-18T15:28:25.263 に答える