我希望通过MQTT协议使用PHP连接到IBM Bluemix来订阅来自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";
}
?>
但浏览器显示此消息:
致命错误:第167行的/Library/WebServer/Documents/phpMQTT/phpMQTT.php超出了30秒的最长执行时间
答案 0 :(得分:1)
订阅并不意味着在Web浏览器中运行,因为它具有无限的外观,最好从命令行运行。
如果您使用subscribe方法接收消息,您可以查看持久消息并在msg收据上打开循环。
有一个如何在文件中的Web浏览器中使用phpMQTT的示例 此存储库https://github.com/vvaswani/bluemix-iotf-device-tracker
的web-app.php答案 1 :(得分:0)
通过这样做,您不会提供有关您想要实现的目标的大量信息;在浏览器中关闭页面之前,您是否希望继续向浏览器发送消息?
服务器发送事件或Websockets可能是更好的选择,并且PHP可能不是最佳选择,因为它每个连接占用了大量内存(例如,与node.js相比)。
但是,如果您只想删除30秒的PHP超时,则可以使用此功能: http://php.net/manual/en/function.set-time-limit.php
或者在php.ini中设置max_execution_time: http://php.net/manual/en/info.configuration.php
将最大执行时间设置为0应该使其不能超时。
但请注意,PHP和/或您的网络服务器将具有有限数量的并发HTTP连接。