所有人,
HTML5 Rocks 有一个关于服务器发送事件(SSE)的不错的初学者教程:
Http://www.html5rocks.com/en/tutorials/eventsource/basics/
但是,我不理解一个重要的概念——是什么触发了服务器上导致发送消息的事件?
In other words - in the HTML5 example - the server simply sends a timestamp 一次:
<?php
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache'); // recommended to prevent caching of event data.
function sendMsg($id, $msg) {
echo "id: $id" . PHP_EOL;
echo "data: $msg" . PHP_EOL;
echo PHP_EOL;
ob_flush();
flush();
}
$serverTime = time();
sendMsg($serverTime, 'server time: ' . date("h:i:s", time()));
如果我正在建立一个实际的例子-例如,一个 Facebook 风格的“墙”或股票报价器,其中服务器将“推送”一个新的消息给客户端每次一些数据变化,这是如何工作的?
换句话说... PHP 脚本是否有一个连续运行的循环,检查数据中的变化,然后每次找到变化时发送消息?如果是这样-你怎么知道什么时候结束这个过程?
或者—— PHP 脚本只是简单地发送消息,然后结束(就像 HTML5Rocks 示例中的情况一样) ?如果是这样-你如何得到持续的更新?浏览器是否只是定期轮询 PHP 页面?如果是这样-这怎么是一个“服务器发送的事件”?这与用 JavaScript 编写 setInterval 函数(使用 AJAX 定期调用 PHP 页面)有什么不同?
抱歉,这可能是一个非常幼稚的问题。但是我找到的所有例子都没有说明这一点。
[更新]
我觉得我的问题措辞不当,所以我来澄清一下。
Let's say I have a web page that should display the most recent price of Apple's stock.
当用户首次打开该页面时,该页面使用我的“流”的 URL 创建一个 EventSource
var source = new EventSource('stream.php');
我的问题是“ stream. php”应该如何工作?
像这样? (伪代码) :
<?php
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache'); // recommended to prevent caching of event data.
function sendMsg($msg) {
echo "data: $msg" . PHP_EOL;
echo PHP_EOL;
flush();
}
while (some condition) {
// check whether Apple's stock price has changed
// e.g., by querying a database, or calling a web service
// if it HAS changed, sendMsg with new price to client
// otherwise, do nothing (until next loop)
sleep (n) // wait n seconds until checking again
}
?>
换句话说——只要客户端“连接”到“ stream. php”,“ stream. php”就保持开放吗?
如果是这样——这是否意味着运行 stream.php
的线程数量与拥有并发用户的线程数量一样多?如果是这样的话——这是否远程可行,或者是否是构建应用程序的合适方法?你怎么知道什么时候你可以 完一个 stream.php
的实例?
我的天真印象是,如果是这种情况,PHP 不是是适合这种服务器的技术。但是到目前为止我看到的所有演示都暗示 PHP 适合这种情况,这就是为什么我如此困惑..。