关于mqtt组件的publish的一些问题,或者说,想请教下思路

pidong
<?php
require __DIR__ . '/../vendor/autoload.php';
use Workerman\Worker;
$worker = new Worker();
$worker->onWorkerStart = function(){
    $mqtt = new Workerman\Mqtt\Client('mqtt://test.mosquitto.org:1883');
    $mqtt->onConnect = function($mqtt) {
       $mqtt->publish('test', 'hello workerman mqtt');
    };
    $mqtt->connect();
};
Worker::runAll();

如示例中:每次publish主题时,都要new Client 。是不是意味着我每次对同一主题发布消息,都会创建一个连接/子进程,最后爆满。
 
目前的业务是有很多设备,需要上传自身状态,服务器也可以下发指令。目前订阅有通配符,创建很少的客户端,再解析就能实现更新设备属性。但是下发指令因为上面这个顾虑卡住了。对进程这方面不是很懂。想问下有影响吗。如果有影响,有没有其他方式处理?
 
 
 

阅读 3635
4个回答

damao

不用每次创建一个啊,创建一个然后保存起来,下次再复用就行。

  • pidong 2019-01-03

    不是太懂,请教下如何保存,下次如何取用呢

damao
<?php
require __DIR__ . '/../vendor/autoload.php';
use Workerman\Worker;
$worker = new Worker();
$worker->onWorkerStart = function(){
    global $mqtt;
    $mqtt = new Workerman\Mqtt\Client('mqtt://test.mosquitto.org:1883');
    $mqtt->onConnect = function($mqtt) {
       $mqtt->publish('test', 'hello workerman mqtt');
    };
    $mqtt->connect();
};
$worker->onMessage = function($con, $msg){
    global $mqtt;
    $mqtt->publish(.....);
};
Worker::runAll();

没测试过,不过感觉这样就可以

  • pidong 2019-01-03

    多谢,的确是个思路,我先尝试尝试

  • pidong 2019-01-03

    onMessage应该是接收到消息时触发的,我publish时应该是主动的。好像逻辑上不通

  • pidong 2019-01-03

    我总是觉得其实我只是需要创建一个客户端,不管发布订阅都用这一个客户端实例,是不是可以让这个实例跟随workman存在内存中,不管发布还是订阅先看这个实例存在不存在,如果存在就用,不存在就创建一个

  • damao 2019-01-03

    上面的代码就是这样的,创建了一个实例跟随workerman内存中

  • damao 2019-01-03

    上面只是一个例子,并不是说一定让你在onMessage里去publish啊

  • pidong 2019-01-04

    @16:的确是你的思路提醒的

pidong

http://doc.workerman.net/faq/push-in-other-project.html
看来我文档还是没看仔细,这里有相关解答

  • 暂无评论
dmjlovehj

您解决没有呀,,给我说说呀,我也是这样的情况 也不知道 怎么弄了 ,

  • 暂无评论