全局共享MQTT连接遇到的问题

roczyl

问题描述

按照
https://github.com/walkor/webman/issues/216

创建了

  1. 订阅服务进程 process/Subscriber.php
  2. 共享发布进程 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

122 2 0
2个回答

roczyl

vendor\workerman\mqtt\src\Protocols\Mqtt.php
文件中,init函数,第105行:
class_alias($className, '\Workerman\Protocols\Mqtt');

也就是说,只要运行了两次init,就会出错

  • roczyl 4天前

    建立的bootstrap/Mqtt.php,如果在stat里面写$mqtt->onMessage回调的话,会执行收到两次。
    是不是
    订阅服务进程 process/Subscriber.php
    共享发布进程 bootstrap/Mqtt.php
    这两个不能共用?共用了就产生了class_alias错误。

更新到 2.1 版本

  • roczyl 4天前

    谢谢。后来还是用了https://www.workerman.net/a/1680中“利用webman自定义进程“的方式。
    bootstrap/Mqtt.php,如果在stat里面写$mqtt->onMessage回调的话,会收到两次回调。

×
🔝