最近、EventSource を発見しました。YUI3 には動作を正規化してフォールバックするための Gallery モジュールがあります。このフレームワークを既に使用しているため、この例で使用することを選択しました。
だから私はかなりのことを検索し、多くのブログ、投稿、および例を読みましたが、それらはすべてほとんど同じことを示しています: 基本的な SSE イベントのセットアップ方法. これで、open/message/error/close イベントが発生する 6 つの例が得られました。
私が持っていないもの (このリンクが私に与えてくれることを望んでいたもの) は、アプリケーションにとってより便利な SSE イベントを発生させる方法の例です。「更新」と呼ばれるものを試しています。
ここに私の基本的なテスト ページがあります: http://codefinger.co.nz/public/yui/eventsource/test.php (これは html ファイルである可能性があります。ここにはまだ php コードはありません)
EventSource コンストラクターの「message.php」は次のとおりです。
<?php
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache'); // recommended to prevent caching of event data.
/**
* Constructs the SSE data format and flushes that data to the client.
*
* @param string $id Timestamp/id of this connection.
* @param string $msg Line of text that should be transmitted.
*/
function sendMsg($id, $msg) {
echo "id: $id" . PHP_EOL;
echo "data: $msg" . PHP_EOL;
echo PHP_EOL;
ob_flush();
flush();
}
while(true) {
$serverTime = time();
sendMsg($serverTime, 'server time: ' . date("h:i:s", time()));
sleep(10);
}
// I was hoping calling this file with a param might allow me to fire an event,
// which it does dutifully, but no browsers register the 'data : update' - though
// I do see the response in Firebug.
if( $_REQUEST['cmd'] ){
sendMsg($serverTime, $_REQUEST['cmd'] );
}
?>
上記のライブの例から、YUI の io モジュールを使用して、「更新」ボタンをクリックしたときに「更新」イベントを発生させるためにパラメーターを指定してリクエストを送信しようとしたことがわかります。Firebug の [Net] パネルでわかるように、動作しているように見えますが、イベントが処理されていません (上記のスクリプトがそのループを再度実行することに気付きました。接続されたブラウザーでイベントを処理したいだけなので、削除します)。 /掃除)。
私はこの部分を間違っていますか?それとも、私が間違っているもっと根本的なことがありますか? UI の状態の変化に応じてイベントをプッシュしようとしています。
この SO の質問は近いように見えました。@tomfumb は、次の質問は「最初の接続が確立された後にクライアントに新しいイベントを送信する方法です。PHP は決して実行を停止する必要がないことがわかりました。」とコメントしました。しかし、確かに私はイベントが発生したときにのみ送信します...そして継続的にではありません...