使用Php将数据从一个客户端推送到另一个客户端

我正在进行我的空气质量监测系统的大学项目,数据(比如一些整数值)必须从传感单元到网页。

我想要的是

是由这个url http://localhost/AQProject/recordupdate.php?val=2调用的脚本更新显示内容的网页。 现在我知道我可以将数据保存在数据库中,并每两秒钟运行一次基于Ajax的查询来检查更新,但是我希望更新由服务器推送。

我做了什么:

我曾尝试Server sent events 。 这是我的尝试

 <?php header('Content-Type: text/event-stream'); header('Cache-Control: no-cache'); if($_SERVER["REQUEST_METHOD"]=="GET") { if(empty($_GET["val"])) die ("Empty Value from source"); else { $v = $_GET['val']; echo "data: The Pollution stub value is {$v}".PHP_EOL; ob_flush(); flush(); } }?> 

和HTML有脚本

  <script> if(typeof(EventSource) !== "undefined") { var source = new EventSource("recordupdate.php"); source.onmessage = function(event) { document.getElementById("result").innerHTML = event.data + "<br>"; }; } else { document.getElementById("result").innerHTML = "Sorry, your browser does not support server-sent events..."; } </script> 

现在,我已经知道了这一点(纠正我,如果我错了),它将无法正常工作,因为当另一个客户端(传感单元)呼吁recordupdate.php它的一个不同的脚本实例比网页客户端调用。

有没有任何可能的方式使用server sent events做到这一点? 或者我绝对需要挖掘到websockets,node.js等在此先感谢

你想要做的并不像你期望的那么容易,但这仍然是上交所适合的工作。 你不需要使用套接字,也不需要使用ajax轮询。

但是你确实需要在服务器上有一些可以被PHP脚本共享的数据库存储。 安装一个LAMP堆栈非常简单,我build议使用MySQL,即使这可能是你需要的矫枉过正。 但是你的数据库可以像文本文件一样简单。

(为了保持下面的示例尽可能小,我假设你的数据库将是/tmp/val.txt ,我没有做任何文件locking,或检查不良数据。只是要知道,你需要做的在不可信任的环境下进行生产之前需要做一些工作,我build议预先创build/tmp/val.txt文件,以避免文件不存在任何噪音。)

你的recordupdate.php有logging它的值的工作:

 <?php if($_SERVER["REQUEST_METHOD"]=="GET") { if(empty($_GET["val"])) die ("Empty Value from source"); else file_put_contents("/tmp/val.txt", $_GET['val']); } 

然后你有sse.php,哪些Web客户端连接到:

 <?php header('Content-Type: text/event-stream'); header('Cache-Control: no-cache'); $prev = ''; while(1){ $v = file_get_contents("/tmp/val.txt"); if($v != $prev){ echo "data: The Pollution stub value is {$v}\n\n"; $prev = $v; } usleep(100000); //0.1s } 

该脚本正在每秒钟检查文本文件10次。 一旦它发现一个它发送到客户端。 (平均延迟是0.05s加上networking开销。)如果您需要较低的延迟,则hibernate较less的时间。

对前端HTML的唯一更改是调用“sse.php”,而不是:

 <script> if(typeof(EventSource) !== "undefined") { var source = new EventSource("sse.php"); source.onmessage = function(event) { document.getElementById("result").innerHTML = event.data + "<br>"; }; } else { document.getElementById("result").innerHTML = "Sorry, your browser does not support server-sent events..."; } </script> 

HTTP是单向协议。 仅从客户端到服务器的请求。 是的,绝对需要挖掘websockets,node.js等