关于listen() 和 run()的问题

再也不

关于listen() 和 run()的问题


最近正在学习workerman,看到源码里的listen() 和 run() 函数里面都有一个add()方法。

// 放到全局事件轮询中监听_mainSocket可读事件(客户端连接事件)

if(self::$globalEvent) //  此处是实例化的Select
{
    if($this->transport !== 'udp')
    {
        self::$globalEvent->add($this->_mainSocket, EventInterface::EV_READ, array($this, 'acceptConnection')); // 添加到select 事件库中 读事件
    }
    else
    {
        self::$globalEvent->add($this->_mainSocket,  EventInterface::EV_READ, array($this, 'acceptUdpConnection'));
    }
}

**此处的add方法是listen()的最后调用的,后面我有看到 run()方法里面也有add() 方法,但是listen() 和 run()里面的add()方法虽然是一样的,但是应该是互相独立的,因为都各自实例化了下 Select(),但是我不明白的是listen()最后调用了 add() 进行添加到select 事件库中,但是好像后面并没有了其他操作,而run()方法里面调用了add()方法,它后面好歹有TIme() 和 loop()进行后续处理啊。

跪求哪位高手给我详细分析下啊, listen() 调用的 add() 的作用哈**

2930 1 0
1个回答

walkor

workerman允许在服务运行过程中调用new Worker实例化Worker建立监听其它端口。此时因为已经在运行,所以不需要调用run方法,直接调用listen方法,将新的监听add到EventLoop中即可。

$worker = new Worker('http://0.0.0.0:1234');
$worker->onWorkerStart = function($worker) {
    $ws_worker = new Worker('websocket://0.0.0.0:5678');
    $ws_worker->onMessage = 'on_message';
    // 调用listen,将ws_worker的监听socket加入到EventLoop中
    $ws_worker->listen();
};
$worker->onMessage = 'on_message';
function on_messge($con, $msg) {
    var_dump($msg);
    $con->send('ok');
}
Worker::runAll();
  • 暂无评论
年代过于久远,无法发表回答
🔝