MQTT Подписаться с PHP на IBM Bluemix

Я хочу подключиться к IBM Bluemix через протокол MQTT, используя PHP для подписки на сообщения, поступающие из IoT Foundation. Я использую этот код:

<?php

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


$config = array(
  'org_id' => 't9m318',
  'port' => '1883',
  'app_id' => 'phpmqtt',
  'iotf_api_key' => 'my api key',
  'iotf_api_secret' => 'my api secret',
  'device_id' => 'phpmqtt'
);

$config['server'] = $config['org_id'] .'.messaging.internetofthings.ibmcloud.com';
$config['client_id'] = 'a:' . $config['org_id'] . ':' .$config['app_id'];
$location = array();

// initialize client
$mqtt = new phpMQTT($config['server'], $config['port'], $config['client_id']); 
$mqtt->debug = false;

// connect to broker
if(!$mqtt->connect(true, null, $config['iotf_api_key'], $config['iotf_api_secret'])){
  echo 'ERROR: Could not connect to IoT cloud';
    exit();
} 

$topics['iot-2/type/+/id/phpmqtt/evt/+/fmt/json'] = 
  array("qos"=>0, "function"=>"procmsg");
$mqtt->subscribe($topics, 0);

// process messages
while ($mqtt->proc(true)) { 

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

?>

Но браузер показывает это сообщение:

Неустранимая ошибка: максимальное время выполнения 30 секунд превышено в /Library/WebServer/Documents/phpMQTT/phpMQTT.php в строке 167

2 ответа

Подписка не предназначена для запуска в веб-браузере, поскольку она имеет бесконечный вид, ее лучше всего запускать из командной строки.

Если вы используете метод подписки для получения сообщений, вы можете посмотреть на постоянные сообщения и выход из цикла при получении сообщения.

Пример использования phpMQTT в веб-браузере приведен в файле web-app.php этого репозитория https://github.com/vvaswani/bluemix-iotf-device-tracker

Вы не предоставляете очень много информации о том, чего вы хотите достичь, делая это; Вы хотите продолжать отправлять сообщения в браузер, пока страница не будет закрыта в браузере?

События, отправленные на сервер, или веб-сокеты могут быть лучшим выбором, и PHP может быть не лучшим выбором для этого, поскольку он использует довольно много памяти на соединение (по сравнению, например, с node.js).

Однако, если вы просто хотите удалить 30-секундный тайм-аут PHP, вы можете использовать эту функцию: http://php.net/manual/en/function.set-time-limit.php

Или установите max_execution_time в php.ini: http://php.net/manual/en/info.configuration.php

Установка максимального времени выполнения на 0 должно остановить его от истечения времени ожидания.

Но имейте в виду, что PHP и / или ваш веб-сервер будут иметь ограниченное количество одновременных HTTP-соединений.

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