最近正在學(xué)習(xí)workerman,看到源碼里的listen() 和 run() 函數(shù)里面都有一個add()方法。
// 放到全局事件輪詢中監(jiān)聽_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()的最后調(diào)用的,后面我有看到 run()方法里面也有add() 方法,但是listen() 和 run()里面的add()方法雖然是一樣的,但是應(yīng)該是互相獨立的,因為都各自實例化了下 Select(),但是我不明白的是listen()最后調(diào)用了 add() 進行添加到select 事件庫中,但是好像后面并沒有了其他操作,而run()方法里面調(diào)用了add()方法,它后面好歹有TIme() 和 loop()進行后續(xù)處理啊。
跪求哪位高手給我詳細(xì)分析下啊, listen() 調(diào)用的 add() 的作用哈**
workerman允許在服務(wù)運行過程中調(diào)用new Worker實例化Worker建立監(jiān)聽其它端口。此時因為已經(jīng)在運行,所以不需要調(diào)用run方法,直接調(diào)用listen方法,將新的監(jiān)聽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';
// 調(diào)用listen,將ws_worker的監(jiān)聽socket加入到EventLoop中
$ws_worker->listen();
};
$worker->onMessage = 'on_message';
function on_messge($con, $msg) {
var_dump($msg);
$con->send('ok');
}
Worker::runAll();