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


Keep a MQTT Client Connection always active

我在基于Pub-Sub的应用程序中使用CloudMQTT作为MQTT broker。我使用我的publisher通过topicCloudMQTT server发布数据,我计划通过subscribe向我网页上的broker接收传输的信息。

我正在使用这个过程来创建一个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

然而,在这种情况下的问题是,它只在网页打开时接收数据。我想保持连接,即使网页不打开,总是接收已发布的消息,我该怎么做?

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

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

可以在长时间运行的CLI PHP脚本中订阅MQTT主题,但是必须使用其他机制来保持流程运行。有很多不同的方法可以做到这一点,这取决于您的偏好和操作系统:

  • 一个脚本开始使用/etc/rc本地系统启动
  • 使用init。d脚本
  • 使用进程管理器,如DJB的daemontools或runit
  • 如果你使用的是Ubuntu,那么upstart是一个流行的机制

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

  • 运行php脚本作为守护进程