【问题标题】:Server Sent Event Code Functioning Differently Across Servers服务器发送的事件代码在不同服务器之间运行不同
【发布时间】: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


【解决方案1】:

需要检查的几件事...您的服务器端脚本和客户端脚本是否同源?我知道这可能会导致某些浏览器出现问题,但我承认我已经有一段时间没有使用 SSE 了,所以我不知道这是否仍然适用。

您可能还想在您的内容类型声明下添加header('Cache-Control: no-cache');,请务必确定。

您可能需要联系 AWS 支持以了解他们的想法。

另外,我知道这听起来很愚蠢,但在更改代码(cookie、缓存等)后完全清除所有浏览器信息。

【讨论】:

  • 是的,每次安装的服务器和客户端脚本都具有相同的来源。我正在为 MVC 使用 codeigniter,并且两个脚本都使用相同的模式设置。我还添加了额外的 Cache-Control 声明,但它似乎不会影响结果。 AWS 支持有点欠缺,所以我想我会在这里尝试,但我可能只得继续纠缠他们。
【解决方案2】:

如果你的服务器在 nginx 后面运行,那么你需要添加

    proxy_buffering off;

到 nginx 设置。对于 apache,请查看此链接: Prevent output buffering with PHP and Apache

【讨论】:

    猜你喜欢
    • 2016-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-06
    • 1970-01-01
    相关资源
    最近更新 更多