2012-06-07 43 views
2

我刚开始在我的PHP页面中使用SSE。我可以很容易使用此代码发送新数据:PHP服务器发送事件减少流量

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界面事件源脚本发送新数据。

只有当我告诉它这样做。 我该如何做到这一点?

感谢您的帮助,以亲切的问候,朱利安

+0

您是否找到解决方案?我正在尝试做类似的事情。 –

+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分钟或更长时间。

+0

所以要清楚,这个脚本将每秒选择你的整个SQL表...对于每个事件源连接? –

+0

是的。这是相当糟糕的,但实际上没有其他方式在简单的,好的,旧的PHP中这样做。 –