//// 這時(shí)候已經(jīng)初始化操作
Worker::$globalEvent = new Event();
$worker = new Worker("http://0.0.0.0:8818");
$worker->count = 8;
$worker->reusePort = false;
Worker::runAll();
// Get column mapping for UI
foreach(static::getUiColumns() as $column_name => $prop){
!isset($worker->{$prop}) && $worker->{$prop} = 'NNNN';
$prop_length = \strlen((string) $worker->{$prop});
$key = '_max' . \ucfirst(\strtolower($column_name)) . 'NameLength';
static::$$key = \max(static::$$key, $prop_length);
}
// Listen.
if (!$worker->reusePort) {
$worker->listen();
}
/// 由于已經(jīng)初始化,就能通過(guò)這里
public function resumeAccept()
{
// Register a listener to be notified when server socket is ready to read.
if (static::$globalEvent && true === $this->_pauseAccept && $this->_mainSocket) {
if ($this->transport !== 'udp') {
static::$globalEvent->add($this->_mainSocket, EventInterface::EV_READ, array($this, 'acceptConnection'));
} else {
static::$globalEvent->add($this->_mainSocket, EventInterface::EV_READ, array($this, 'acceptUdpConnection'));
}
$this->_pauseAccept = false;
}
}
// 但forkOneWorkerForLinux()看這里又是允許的
// Create a global event loop.
if (!static::$globalEvent) {
$event_loop_class = static::getEventLoopName();
static::$globalEvent = new $event_loop_class;
}
// Reinstall signal.
static::reinstallSignal();
//// 疑問(wèn):
因?yàn)閙aster已經(jīng)把mainSocket加入eventloop()了。
這時(shí)候globalEvent 已經(jīng)被初始化,多個(gè)worker 進(jìn)程會(huì)拷貝master的已經(jīng)加入eventloop數(shù)據(jù),這樣不會(huì)出現(xiàn)問(wèn)題?
//// 文檔講解了作用: http://wtbis.cn/doc/workerman/worker/global-event.html
/// 還是說(shuō)我這種用法Worker::$globalEvent = new Event();本身就是不被允許的呢?
Worker::$globalEvent 直接在業(yè)務(wù)中用,不用也不能初始化
這時(shí)候能不能通過(guò)Master 去檢測(cè)用戶是否已經(jīng)這樣使用:
Worker::$globalEvent = new Event();
$worker = new Worker("http://0.0.0.0:8818");
$worker->count = 8;
$worker->reusePort = false;
Worker::runAll();
直接把他在master里面 static::$globalEvent = null;
這樣的話就從實(shí)現(xiàn)上面規(guī)避這種不被允許的用法呢?
子進(jìn)程就算拷貝過(guò)來(lái)也還是null,這樣worker進(jìn)程自己new Eventloop();就好了。
這代碼都好幾年了,你讓我想其中細(xì)節(jié)我也記不起來(lái)了,可能是當(dāng)時(shí)版本主進(jìn)程會(huì)創(chuàng)建eventLoop,也可能是為了做單元測(cè)試吧,
這樣修復(fù)下:
Master 里面寫(xiě):
if( static::$globalEvent instanceof EventInterface) {
$eventloop = static::$globalEvent;
static::$eventloopClass = get_class($evnetloop);
static::$globalEvent = null;
}
子進(jìn)程復(fù)制過(guò)來(lái)也是未初始化的globalEvent, 也會(huì)按照用戶的事件驅(qū)動(dòng)進(jìn)行運(yùn)行Workerman。
這樣就兼容了這種錯(cuò)誤寫(xiě)法,底層實(shí)現(xiàn)上規(guī)避這種問(wèn)題。
看看提交個(gè)pr,能否合并呢,不能就關(guān)閉就是啦。