workerman-mqtt版本
{
"name" : "workerman/mqtt",
"type" : "library",
"homepage": "http://www.workerman.net",
"license" : "MIT",
"require": {
"workerman/workerman" : ">=3.3.0"
},
"autoload": {
"psr-4": {"Workerman\\Mqtt\\": "./src"}
}
}
运行暂无问题,就是运行了有好大半年了,突然发现有一部分数据未收到;服务端和订阅端都是QOS=2
订阅端代码
use Workerman\Worker;
$worker = new Worker();
$worker->onWorkerStart = function () {
$options = ['client_id' => 'xxx', 'reconnect_period' => 1, 'username' => 'xxx', 'password' => 'xxx', 'debug' => false];
$mqtt = new Workerman\Mqtt\Client(MQTT_ADDR, $options);
$mqtt->onConnect = function ($mqtt) {
do_log('Connected to MQTT broker');
$mqtt->subscribe('topic', ['qos' => 2]);
};
$mqtt->onMessage = function ($topic, $content) {
do_log('开始处理消息');
procMsg($topic, $content);
};
$mqtt->connect();
};
Worker::runAll();
function procMsg($topic, $msg)
{
do_log('msg: ' . $msg);
// 做了一点业务: 将消息数据插入到表里
// 这里可能有点问题,因为自己写的是每次都new一个PDO,现在准备改掉,但是不知道是否和这个有关
}
也没报错也没啥异常;对方也有一台机器也是订阅的,但是他们有数据,我这没数据,也不知道是不是有这种"多个订阅方同时订阅同一个主题时,某个订阅方可能会丢失消息"的问题,因为我们都调整过都是
qos=2
,请大佬们指点下查找思路和解决思路
原因:
ps -ef | grep
的时候随便填了个有点关系的关键字没搜到全部进程,没有kill
掉全部的,再进行重启,导致部分进程还在跑以前的代码,导致一会日志记录现在的内容一会是记录以前的内容;- 处理消息业务部分,没在意业务已经换库了(大半年没改过了,忘了),把自己本地的链接覆盖上去了,导致一直处于
SQLSTATE[HY000] [2002] Connection refused