全局共享MQTT连接遇到的问题
问题描述
按照
https://github.com/walkor/webman/issues/216
创建了
订阅服务进程 process/Subscriber.php
共享发布进程 bootstrap/Mqtt.php
除MQTT服务器信息外,其他代码和issues中的保持一致
在windows下运行
报错信息
ErrorException: Cannot declare class \Workerman\Protocols\Mqtt, because the name is already in use in D:\webman\webman_mqtt\vendor\workerman\mqtt\src\Protocols\Mqtt.php:105
Stack trace:
0 [internal function]: {closure}()
1 D:\webman\webman_mqtt\vendor\workerman\mqtt\src\Protocols\Mqtt.php(105): class_alias()
2 D:\webman\webman_mqtt\vendor\workerman\mqtt\src\Client.php(242): Workerman\Mqtt\Protocols\Mqtt::init()
3 D:\webman\webman_mqtt\app\process\MqttSubscribe.php(35): Workerman\Mqtt\Client->__construct()
4 D:\webman\webman_mqtt\vendor\workerman\webman-framework\src\support\helpers.php(512): app\process\MqttSubscribe->onWorkerStart()
5 D:\webman\webman_mqtt\vendor\workerman\webman-framework\src\support\helpers.php(558): worker_bind()
6 D:\webman\webman_mqtt\vendor\workerman\workerman\src\Worker.php(2544): {closure}()
7 D:\webman\webman_mqtt\vendor\workerman\workerman\src\Worker.php(1593): Workerman\Worker->run()
8 D:\webman\webman_mqtt\vendor\workerman\workerman\src\Worker.php(1519): Workerman\Worker::forkWorkersForWindows()
9 D:\webman\webman_mqtt\vendor\workerman\workerman\src\Worker.php(585): Workerman\Worker::forkWorkers()
10 D:\webman\webman_mqtt\runtime\windows\start_mqtt.php(33): Workerman\Worker::runAll()
11 {main}
操作系统及workerman/webman等框架组件具体版本
Workerman\Mqtt 2.0
2 个回答
发表回答
vendor\workerman\mqtt\src\Protocols\Mqtt.php
文件中,init函数,第105行:
class_alias($className, '\Workerman\Protocols\Mqtt');
也就是说,只要运行了两次init,就会出错
建立的bootstrap/Mqtt.php,如果在stat里面写$mqtt->onMessage回调的话,会执行收到两次。
是不是
订阅服务进程 process/Subscriber.php
共享发布进程 bootstrap/Mqtt.php
这两个不能共用?共用了就产生了class_alias错误。
更新到 2.1 版本
谢谢。后来还是用了https://www.workerman.net/a/1680中“利用webman自定义进程“的方式。
bootstrap/Mqtt.php,如果在stat里面写$mqtt->onMessage回调的话,会收到两次回调。