使用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等