保持MQTT客户端连接始终处于活动状态

时间:2016-10-24 15:05:15

标签: php client publish-subscribe mqtt phpmqtt

我在基于Pub-Sub的应用程序中使用CloudMQTT作为MQTT broker。我正在使用我的publisher将数据发布到CloudMQTT server topic上,我计划subscribe发送到我网页上的代理,以接收传输的信息。

我正在使用此程序创建Client(订阅者):https://www.cloudmqtt.com/docs-php.html

代码如下:

// subscribe.php
require("phpMQTT.php");

$host = "hostname"; 
$port = port;
$username = "username"; 
$password = "password"; 

$mqtt = new phpMQTT($host, $port, "ClientID".rand()); 

if(!$mqtt->connect(true,NULL,$username,$password)){
  exit(1);
}

//currently subscribed topics
$topics['topic'] = array("qos"=>0, "function"=>"procmsg");
$mqtt->subscribe($topics,0);

while($mqtt->proc()){        
}

$mqtt->close();
function procmsg($topic,$msg){
  echo "Msg Recieved: $msg";
}

以下是phpMQTT.php文件:https://github.com/bluerhinos/phpMQTT/blob/master/phpMQTT.php

然而,在这种情况下的问题是它只在网页打开时收到数据。我想保持连接活着,即使网页没有打开以始终收到已发布的消息,我该怎么办?< / p>

编辑:如果有人可以推荐一些替代方案,我可能愿意在服务器上使用其他技术来处理此订阅流程

1 个答案:

答案 0 :(得分:2)

PHP的典型操作模式是启动进程,等待HTTP连接,处理请求然后启动新进程。这不适合具有长时间运行过程的典型MQTT模式;因此,当您关闭网页时关闭MQTT连接。

可以在长时间运行的CLI PHP脚本中订阅MQTT主题,但您必须有其他一些机制来保持进程运行。根据您的偏好和操作系统,有很多不同的方法:

  • 在系统启动时使用/etc/rc.local启动的脚本
  • 使用init.d脚本
  • 使用流程管理器,例如DJB的daemontools或runit
  • 如果您使用的是Ubuntu,那么新贵是一种流行的机制

搜索stackoverflow会找到以下相关问题和几个答案: