大家好,
HTML5 Rocks 有一篇很好的 Server-sent Events (SSE) 入门教程:
http://www.html5rocks.com/en/tutorials/eventsource/basics/
但是,我不明白一个重要的概念 - 是什么触发了服务器上的事件导致消息被发送?
换句话说 - 在 HTML5 的示例中 - 服务器只是发送了一个时间戳,而且只发送了一次:
<?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页面?如果是这样-这与编写使用AJAX调用PHP页面的setInterval函数有什么不同?
抱歉-这可能是一个非常幼稚的问题。但我能够找到的所有示例都没有说明这一点。
[更新]
我想我的问题表达不清,请看下面的说明。
假设我有一个网页,应该显示苹果公司股票的最新价格。
当用户首次打开页面时,页面将使用“流”的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
的实例?
我天真的印象是,如果是这种情况,PHP不适合这种类型的服务器。但是,到目前为止,我看到的所有演示都暗示PHP非常适合此类情况,这就是我如此困惑的原因...
EventSource('stream.php')
对象时,客户端会打开与stream.php
的连接,就像通过ajax调用它一样。这个连接触发了你的服务器端代码,并保持连接打开,只要你的服务器端代码有话要说。然后连接关闭,在短暂的延迟后(我想在chrome中是3秒),客户端重新打开连接,这又会触发你的stream.php
文件。 - Ahmad Maleki