首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Php将数据从一个客户端推送到另一个客户端

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

Stack Overflow用户
提问于 2017-02-19 18:51:14
回答 2查看 1.1K关注 0票数 2

我正在做一个关于空气质量监测系统的大学项目,因为这些数据(比如一些整数值)必须从感测单元到网页。

我想要什么

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

我做了什么:

我试过了Server sent events。这是我试过的

代码语言:javascript
复制
<?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有脚本

代码语言:javascript
复制
    <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等等。谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-02-20 09:46:31

你想要做的事情并不像你希望的那么容易,但这仍然是一份适合SSE的工作。您不需要使用套接字,也不需要使用ajax轮询。

但是,您确实需要在服务器上存储一些可以由PHP脚本共享的数据库存储。由于安装灯堆栈非常容易,我建议您使用MySQL,尽管它可能会对您所需的东西造成太大的损失。但是您的数据库可以像文本文件一样简单。

(为了保持下面的示例尽可能小,我假设您的DB将是/tmp/val.txt,并且我没有进行任何文件锁定,也没有检查不良数据。请注意,在不受信任的环境中进行生产之前,您需要做一些工作。我建议预先创建/tmp/val.txt以避免对不存在的文件产生任何干扰。)

您的recordupdate.php的任务是记录它给定的值:

代码语言:javascript
复制
<?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客户端连接到哪个web客户端:

代码语言:javascript
复制
<?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加上网络开销。)如果您需要较低的延迟时间,则睡眠时间较短。

对前端HTML的唯一更改是调用"sse.php“:

代码语言:javascript
复制
<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>
票数 1
EN

Stack Overflow用户

发布于 2017-02-19 19:15:29

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42331373

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档