Неблокирующий абонент MQTT [PHP]
Я использую Raspberry Pi, чтобы выступить в качестве брокера MQTT для группы датчиков. Идея состоит в том, чтобы иметь форму с полем ввода на веб-сайте, и на основе значения поля ввода при отправке клиент должен опубликовать сообщение для брокера MQTT, а затем начать подписку на ту же тему.
Затем веб-сайт должен дождаться ответа от сервера MQTT (т. Е. Message sent = "temp"), а RBP публикует новое сообщение "Temp is 35 градусов Цельсия".
Однако, когда я вызываю функцию подписчика, PHP получает фатальную ошибку Fatal error: Maximum execution time of 30 seconds exceeded
Похоже, PHP слишком долго блокирует скрипт, поэтому завершает работу до получения сообщения. Мне нужен PHP-скрипт для прослушивания максимум 1-2 минуты, а затем он может закрыть соединение MQTT.
<?php
require("phpMQTT.php");
$server = "xx.xx.xx.xx";
$port = 1883;
$username = "username";
$password = "password";
$client_id = uniqid();
$mqtt = new phpMQTT($server, $port, $client_id);
//Read message from form, which type of sensor to read
$msg = $_POST['sensor'];
if (!empty($msg)) {
if ($mqtt->connect(true, null, $username, $password)) {
//Publish type of sensor to read
$mqtt->publish("dev/sensors", $msg , 0);
$mqtt->close();
}
//Start listen for response
subscribeToTopic($mqtt);
}
function subscribeToTopic($mqtt)
{
//Set topic to listen to
$topics['dev/sensors'] = array("qos" => 0, "function" => "procmsg");
$mqtt->subscribe($topics, 0);
//Listen for the response in the subscribed topic
while ($mqtt->proc()) {
}
$mqtt->close();
}
function procmsg($topic, $msg)
{
global $mqtt;
echo $msg;
//Close mqtt-connection after message is received
$mqtt->close();
}
?>
Если использование MQTT невозможно для подключений к веб-сайту / серверу MQTT, что может быть более подходящей альтернативой для достижения этой логики?