サーバーがすぐに接続を閉じず、HTML を受信したときに表示することをブラウザーに伝えるために、HTTP ヘッダーを返す必要がありますか? HTML を flush() のように段階的に表示するために必要なものはありますか?
以前はチャットなどで使われていた手法ですが、COMET系のアプリで使おうと考えています。
サーバーがすぐに接続を閉じず、HTML を受信したときに表示することをブラウザーに伝えるために、HTTP ヘッダーを返す必要がありますか? HTML を flush() のように段階的に表示するために必要なものはありますか?
以前はチャットなどで使われていた手法ですが、COMET系のアプリで使おうと考えています。
より堅牢なソリューションは、サーバーに新しいデータをポーリングする Javascript タイマーを備えたページだと思います。応答を開いたままにしておくことは、HTTP プロトコルが設計された目的ではありません。
スクリプトの最後で、次のようなものを使用します (ページの上部に ob_start() を配置して出力バッファリングをオンにしたと仮定します)
<?php
set_time_limit(0); // Stop PHP from closing script after 30 seconds
ob_start();
echo str_pad('', 1024 * 1024, 'x'); // Dummy 1 megabyte string
$buffer = ob_get_clean();
while (isset($buffer[0])) {
$send = substr($buffer, 0, 1024 * 30); // Get 30kbs bytes from buffer :D
$buffer = substr($buffer, 1024 * 30); // Shorten buffer
echo $send; // Send buffer
echo '<br />'; // forces browser to reload contents some how :P
ob_flush(); // Flush output to browser
flush();
sleep(1); // Sleep for 1 second
}
?>
このスクリプトは、ユーザーとサーバーの接続がどれほど高速であっても、基本的に 30kbs (シミュレート) で 1 メガバイトのテキストを出力します。