服务器发送的事件和php - 什么触发服务器上的事件?
都
HTML5 Rocks有一个关于服务器发送事件(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 页面?如果是这样 - 这如何成为“服务器发送的事件”?这与在 JavaScript 中编写使用 AJAX 定期调用 PHP 页面的 setInterval 函数有何不同?
对不起 - 这可能是一个非常天真的问题。但是我能找到的例子中没有一个能清楚地说明这一点。
[更新]
我认为我的问题措辞不当,所以这里有一些澄清。
假设我有一个网页,应该显示苹果股票的最新价格。
当用户首次打开页面时,该页面将使用我的“流”的 URL 创建一个事件源。
var source = new EventSource('stream.php');
我的问题是 - “流.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
}
?>
换句话说 - 只要客户端“连接”到“流.php”,它是否会保持打开状态?
如果是这样 - 这是否意味着您运行的线程数与并发用户数一样多?如果是这样 - 这是否远程可行,或者构建应用程序的适当方法?你怎么知道什么时候可以结束一个实例?stream.php
stream.php
我天真的印象是,如果是这样的话,PHP就不适合这种服务器。但是到目前为止,我看到的所有演示都暗示PHP对此很好,这就是为什么我如此困惑的原因......