Я хочу подключиться к 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
подписка не предназначена для запуска в веб-браузере, поскольку она имеет бесконечный вид, ее лучше всего запускать из командной строки.
Если вы используете метод подписки для получения сообщений, вы можете посмотреть на постоянные сообщения и выход из цикла при получении сообщения.
В файле есть пример использования phpMQTT в веб-браузере.
web-app.php этого репозитория https://github.com/vvaswani/bluemix-iotf-device-tracker
Вы не предоставляете очень много информации о том, чего вы хотите достичь, делая это; Вы хотите продолжать отправлять сообщения в браузер, пока страница не будет закрыта в браузере?
События, отправленные сервером, или Websockets могут быть лучшим выбором, и 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-соединений.