2

私は自分のページに < head > + いくつかの本文を出力させ、それをブラウザに送信しようとしています。

次に、いくつかの長い mysql クエリを作成し、ページの残りを出力します。

コンテンツを gzip しない限り、これは完全に機能します。

例:

私が使用するコードの簡単な例は次のとおりです。

<?php
ini_set('output_buffering', 'on');

echo "head..wait 3 secs</br>";
ob_flush();
flush();

sleep(3);
echo 'tail';
?>

ここでライブを見るが、gzipはない

または私が働こうとしているもの:

<?php
ini_set('output_buffering', 'on');
ini_set('zlib.output_compression', 'On');

echo "head...wait 3 secs</br>";
ob_flush();
flush();

sleep(3);
echo 'bar';                     
?>

動作しないものを参照してください:こちら

私はこれを私のアプリケーションで動作させる必要がありますが、すべてのページで動作させる必要はありません (gzip を必要としないものや、caldav ライブラリなど、それ自体を処理するライブラリもあります)。

gzip されたコンテンツのフラッシュを機能させるにはどうすればよいですか?

4

1 に答える 1

2

gzip (zlib) を使用していなくてもバッファリングの問題が発生する可能性があるため、これが問題の解決に役立つかどうかはわかりません。

まず、apache に deflate モジュール (mod_deflate または mod_gzip) がロードされている可能性があります。
次のように、現在のスクリプトに対して無効にすることができます。

apache_setenv('no-gzip', 1);

2 つ目は、ブラウザーが応答用に内部バッファーを使用している可能性があります (IE、新しい Firefox、および WebKit ブラウザーでは約 1kB が一般的ですが、一部のブラウザーではこれよりも多い場合も少ない場合もあります)。
これは、次の例のように少なくとも 1kb の空白をエコーすることで解決できます。

echo str_repeat(' ', 1024);

zlib を使用する場合、1kb の空白 (非圧縮) をエコーし​​、フラッシュしても、これらのブラウザーは、圧縮された 1kb までの圧縮データが受信されるまで、コンテンツの解析とレンダリングをトリガーしないことに注意してください。

3 番目に、(スクリプトで明示的に、または php.ini を介してsession.auto_start) セッションを使用している場合は、出力を送信するためにセッションを閉じる必要があります。

session_write_close();

あなたの問題はブラウザのバッファとzlibにあると思います。ブラウザでレンダリングするには、1kb 以上の圧縮データを作成する必要がある場合があります。

-- zlib を使用してフラッシュを作成しようとしましたが、ブラウザが処理を開始するためだけにレンダリングするテキストが大量にあると信じていました。仕事に。

ini_set('output_buffering', 'On');
//ini_set('implicit_flush', 'On');
ini_set('zlib.output_compression', 'On'); // by default 4kB
//ini_set('zlib.output_compression_level', 1);

echo "head...wait 3 secs</br>\n";
echo str_repeat("\n ", 500); // this is enought to work fine without zlib
echo '<span style="display:none">';
readfile('path/to/an/image/file.png'); // around 8kB (4kB should be enough)
echo '</span>';
ob_flush();
flush();

sleep(3);
echo 'bar';
于 2013-08-10T15:32:37.773 に答える