【发布时间】:2014-04-02 19:25:21
【问题描述】:
服务器发送事件不保持打开连接
我一直在使用我在网络上找到的一些示例代码来让一些基本的服务器发送事件在我们的服务器上运行,但是我在跨服务器测试时偶然发现了一些奇怪的行为。下面是在我的控制器中调用的函数:
public function hi() {
header("Content-Type: text/event-stream\n\n");
$counter = rand(1, 10);
while (1) {
// Every two seconds, send a "ping" event.
echo "event: ping\n";
$curDate = date(DATE_ISO8601);
echo 'data: {"time": "' . $curDate . '"}';
echo "\n\n";
ob_flush();
flush();
sleep(2);
}
}
我的观点:
<script>
var evtSource = new EventSource("picks/hi");
evtSource.onmessage = function(e) {
console.log(e.data);
}
evtSource.onerror = function(e) {
console.log("EventSource failed.");
};
evtSource.onopen = function(e) {
console.log("Connection open");
};
evtSource.addEventListener("ping", function(e) {
var newElement = document.createElement("li");
var obj = JSON.parse(e.data);
console.log(obj.time);
}, false);
</script>
现在是奇怪的部分。此代码在我的 hostgator 帐户上正常工作。它打开一个连接,维护它,并每两秒吐出一次时间。如果您在 Chrome 中查看控制台,您将看到以下输出:
Connection open
2014-04-02T15:10:24-0400
{"time": "2014-04-02T15:10:26-0400"}
{"time": "2014-04-02T15:10:28-0400"}
{"time": "2014-04-02T15:10:30-0400"}
{"time": "2014-04-02T15:10:32-0400"}
{"time": "2014-04-02T15:10:34-0400"}
{"time": "2014-04-02T15:10:36-0400"}
{"time": "2014-04-02T15:10:38-0400"}
很遗憾,同样的代码块无法通过 Amazon Web Services 在我们的服务器上运行。当我使用控制台比较两者之间的情况时,我可以看到 hostgator 服务器上的代码确实打开并保持了持久连接。当我在 AWS 实例上执行相同操作时,我看到对数据的 GET 请求处于待处理状态。我相信这是一个 apache 问题,但我找不到任何信息。我需要在服务器端做什么才能使服务器发送的事件正常运行?
【问题讨论】:
-
“AWS”是指您正在运行 EC2 服务器,我假设它是 Linux,运行 Apache 和 PHP?你自己做服务器管理员?两台服务器是否运行相同的发行版、Apache 版本和 PHP 版本?您是否在 AWS 端使用负载均衡器? (很抱歉有这么多问题,但它应该“正常工作”:-)
-
您好,我们遇到了同样的问题,即 SSE 无法与 AWS 服务器一起使用。您的问题找到解决方案了吗?
标签: html codeigniter amazon-web-services server-sent-events