当前位置: 首页 > 知识库问答 >
问题:

服务器发送的事件和php-什么触发服务器上的事件?

葛越
2023-03-14

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函数有何不同?

对不起--这可能是一个难以置信的天真的问题。但我找不到的例子都没有说明这一点。

[更新]

我认为我的问题措辞不佳,所以这里有一些澄清。

var source = new EventSource('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
    }
?>

我幼稚的印象是,如果是这样的话,PHP就不是这种服务器的合适技术。但是到目前为止,我看到的所有演示都暗示PHP对此很好,这就是为什么我如此困惑...

共有1个答案

张绍晖
2023-03-14

服务器发送的事件用于从服务器端到客户端的实时更新。在第一个示例中,来自服务器的连接没有保持,客户机每3秒尝试再次连接一次,使得服务器发送的事件与ajax轮询没有区别。

因此,要使连接持久化,您需要在循环中包装代码,并不断检查更新。

PHP是基于线程的,连接更多的用户将使服务器耗尽资源。这可以通过控制脚本执行时间来解决,并在超过一定时间(即10mins)时结束脚本。EventSourceAPI将自动再次连接,因此延迟在可接受的范围内。

 类似资料:
  • 概述 客户端代码 概述 建立连接 open事件 message事件 error事件 自定义事件 close方法 数据格式 概述 data:数据栏 id:数据标识符 event栏:自定义信息类型 retry:最大间隔时间 服务器代码 参考链接 概述 传统的网页都是浏览器向服务器“查询”数据,但是很多场合,最有效的方式是服务器向浏览器“发送”数据。比如,每当收到新的电子邮件,服务器就向浏览器发送一个“

  • 概述 客户端代码 概述 建立连接 open事件 message事件 error事件 自定义事件 close方法 数据格式 概述 data:数据栏 id:数据标识符 event栏:自定义信息类型 retry:最大间隔时间 服务器代码 参考链接 概述 传统的网页都是浏览器向服务器“查询”数据,但是很多场合,最有效的方式是服务器向浏览器“发送”数据。比如,每当收到新的电子邮件,服务器就向浏览器发送一个“

  • 我试图让服务器发送的事件与Mozilla Firefox一起工作。给定一个Spring Boot的网络服务 使用Chrome浏览器或Edge(始终是最新版本)可以正常工作。我可以在网络分析器选项卡中看到未完成的请求,并且每秒都会显示一个新的时间戳。 然而,当我使用Firefox(84.0.2或更早版本)时,请求也会显示在网络选项卡中,但不会显示响应头或流数据。当我终止Spring后端时,Firef

  • 如果我正确理解了服务器发送事件的原则,那么每次客户端注册到EventSource时,它实际上会打开一个到管理事件的资源的新HTTP连接。与其他HTTP请求相反,连接保持活动状态,因此专用于此客户端的服务器进程/线程将一直运行,直到客户端断开连接。 如果我们有1000个客户端使用SSE连接到一个应用程序,该怎么办?我们是否会有1000个进程/线程(做同样的事情)并发运行以处理SSE?我想我错了,但如

  • 当前,我已经在Express API上为服务器发送的事件设置了一个endpoint,当我从cmd调用endpoint时,使用http://localhost:3000/v1/devices,我得到了流,但当我使用新事件源从Vue应用程序调用endpoint时('http://localhost:3000/v1/devices“)但它只会继续加载,而不会流式传输任何数据。是否有我目前没有做的事情要做

  • 我正在尝试查看从带有Server-Sent事件传输的Signalr服务器发送的保持活动事件。我正在使用Fiddler来查看它,并且我启用了“Stream”Fiddler功能按钮...到目前为止,我没有看到其中任何一个...我正在使用Javascript客户端来正确连接该传输。 为什么我没有在Fiddler上发送任何HTTP消息? 始终考虑到Fiddler正在监视信号服务器所在的HTTP请求/响应。