【问题标题】:PHP Server Sent Event reduce trafficPHP 服务器发送事件减少流量
【发布时间】:2012-06-07 18:58:56
【问题描述】:

我刚开始在我的 PHP 页面中使用 SSE。我可以很容易地用这段代码发送新数据:

while(true) {
    if (isset($_GET["selectedName"]) && $_GET["selectedName"] != "empty") {
        echo "data:current timestamp for user ".$_GET["selectedName"]." is ".time().PHP_EOL;
        echo PHP_EOL;
        ob_flush();
        flush();
    }
    sleep(1);
}

但这意味着,我每秒都在向客户端发送数据,并且我必须运行一个循环。示例中的字符串没有太多数据。但后来我想连接到数据库并从那里提取东西。

如果我要提取整篇文章(或消息或其他任何内容)之类的内容,我会产生大量数据。

现在我的问题是:如何告诉脚本提供新数据并将其从另一个 PHP 脚本发送到客户端?

我创建了一个小的 iOS 应用程序,它使用一个小的 API 将状态更新发送到服务器。我想要一个 API 脚本来告诉 Web 界面事件源脚本发送新数据。

只有当我告诉它这样做时。 我怎样才能做到这一点?

感谢您的帮助,向您问好,朱利安

【问题讨论】:

  • 您找到解决方案了吗?我正在尝试做类似的事情。
  • 是的。阅读我的答案,享受并告诉我你会如何结束:)

标签: php ajax push server-sent-events


【解决方案1】:

考虑到我没有 MUCH 的东西要立即发送(一个从 0 到 4 的状态编号和一个小消息字符串),我决定设置一个变量并检查是否有任何变化:

static $oldStateString;

while(true) {
    $result = mysql_query("SELECT * FROM st_workers");
    $currentStateString = "";

    while ($user = mysql_fetch_array($result)) {
        $currentStateString .= $user["stateIndex"].":--;".$user["state"].":--;".$user["humanReadableName"].":__;";
    }

    if ($currentStateString != $oldStateString) {
        echo "data:".$currentStateString.PHP_EOL;
        echo PHP_EOL;
        ob_flush();
        flush();

        $oldStateString = $currentStateString;
    }
    sleep(1);
}

但是:我注意到您必须稍后再开始事件处理程序,而不是 <body onload="">。这会在大多数浏览器中产生错误,除了 Safari 6 和当前的 FireFox。浏览器无法识别它不再加载。所以“加载微调器”直到 5 分钟或更长时间才会停止。

【讨论】:

  • 所以要明确一点,这个脚本每秒都会选择你的整个 SQL 表...对于每个事件源连接?
  • 是的。这很糟糕,但实际上没有其他方法可以用普通的、好的、旧的 PHP 来做到这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-19
  • 1970-01-01
  • 2013-01-11
  • 2012-09-08
  • 2020-04-17
  • 2015-09-24
  • 2015-06-16
相关资源
最近更新 更多