PHP Server Sent Event减少流量

时间:2012-06-07 18:58:56

标签: php ajax push server-sent-events

我刚开始在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脚本发送到客户端?

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

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

感谢您的帮助,亲切的问候,Julian

1 个答案:

答案 0 :(得分:2)

关于我没有立即发送 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分钟或更长时间。