Держите клиентское соединение MQTT всегда активным

Я использую CloudMQTT как MQTT broker в моем приложении на основе Pub-Sub. Я использую свой 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

Однако проблема в этом случае заключается в том, что он получает данные только тогда, когда веб-страница открыта. Я хочу сохранить соединение активным, даже если веб-страница не открыта, чтобы всегда получать опубликованные сообщения, как я могу это сделать?

РЕДАКТИРОВАТЬ: я мог бы быть открыт для использования некоторых других технологий на сервере для обработки этого процесса подписки, если кто-то может порекомендовать некоторые альтернативы

1 ответ

Решение

Типичный режим работы PHP - запуск процесса, ожидание HTTP-соединения, обработка запроса и запуск нового процесса. Это плохо сочетается с типичным режимом MQTT с длительным процессом; следовательно, закрытие соединения MQTT при закрытии веб-страницы.

Можно подписаться на тему MQTT в долгосрочном PHP-скрипте CLI, но вам потребуется другой механизм, чтобы процесс продолжался. Есть много разных способов сделать это, в зависимости от ваших предпочтений и операционной системы:

  • скрипт начал использовать /etc/rc.local при запуске системы
  • используя скрипт init.d
  • используя менеджер процессов, например, DJB's daemontools или runit
  • Если вы используете Ubuntu, то выскочка является популярным механизмом

Поиск в stackru находит следующий связанный вопрос и несколько ответов:

Другие вопросы по тегам