所有,
HTML5 Rocks提供了有关服务器发送事件(SSE)的不错的初学者教程:
http://www.html5rocks.com/zh-CN/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页面?如果是这样-那“服务器发送事件”如何?这与用JavaScript编写setInterval函数有什么不同,该函数使用AJAX定期调用PHP页面?
抱歉-这可能是一个非常幼稚的问题。但是我找不到的所有例子都没有说明这一点。
[更新]
我认为我的问题措辞不好,所以这里有一些澄清。
假设我有一个网页,其中应显示Apple股票的最新价格。
当用户第一次打开页面时,页面会创建一个带有我的“流” 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对此非常合适,这就是为什么我如此困惑的原因...