0

我想使用 PHP 通过 MQTT 协议连接到 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";
}

?>

但浏览器显示此消息:

致命错误:/Library/WebServer/Documents/phpMQTT/phpMQTT.php 第 167 行的最大执行时间超过 30 秒

4

2 回答 2

1

subscribe 并不意味着在 Web 浏览器中运行,因为它具有无限的外观,最好从命令行运行。

如果您使用 subscribe 方法来接收消息,您可以查看持久性消息并在消息接收时打破循环。

在此存储库的文件 web-app.php 中有一个如何在 Web 浏览器中使用 phpMQTT 的示例https://github.com/vvaswani/bluemix-iotf-device-tracker

于 2016-04-20T19:27:17.650 回答
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 连接。

于 2016-02-17T21:45:34.780 回答