服务器发送事件不维护开放连接
我一直在使用我在网上找到的一些示例代码来获取在我们的服务器上运行的一些基本的服务器发送事件,但是在跨服务器进行测试时我偶然发现了一些奇怪的行为。下面是我的控制器中调用的函数:
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问题,但我找不到任何信息。我需要在服务器端做什么才能使服务器发送的事件正常运行?
答案 0 :(得分:0)
要检查的一些事项......您的服务器端和客户端脚本是否都是同一个来源?我知道这可能会导致某些浏览器出现问题,但不可否认的是,自从我玩SSE之后已经有一段时间了,所以我不知道这是否仍然适用。
您可能还想在您的内容类型声明中添加header('Cache-Control: no-cache');
。
您可能需要与AWS支持小组联系,以了解他们的想法。
此外,我知道这听起来很愚蠢,但在更改代码(Cookie,缓存等等)后,请完全清除所有浏览器信息。
答案 1 :(得分:0)
如果您的服务器在nginx后面运行,那么您需要添加
proxy_buffering off;
到nginx设置。对于apache,请查看以下链接: Prevent output buffering with PHP and Apache