在項(xiàng)目運(yùn)行中遇到不定時(shí)出現(xiàn)這個(gè)問(wèn)題,目前已解決,問(wèn)題如下:
?Gateway.php:372
if ($this->_workerConnections) {
// 調(diào)用路由函數(shù),選擇一個(gè)worker把請(qǐng)求轉(zhuǎn)發(fā)給它
/** @var TcpConnection $worker_connection */
$worker_connection = call_user_func($this->router, $this->_workerConnections, $connection, $cmd, $body);
if (false === $worker_connection->send($gateway_data)) {
$msg = "SendBufferToWorker fail. May be the send buffer are overflow. See http://wiki.workerman.net/Error2";
static::log($msg);
return false;
}
}
// 沒(méi)有可用的 worker此時(shí)判斷了$this->_workerConnections是否為真,如果為真就去調(diào)用了路由函數(shù)
?
如果此時(shí)reload,用戶(hù)有多個(gè)worker進(jìn)程,并且自定義了路由,需要把用戶(hù)路由到特定worker進(jìn)程
?
那么此時(shí)在$this->_workerConnections中很有可能不是全部已啟動(dòng)好的worker
其中可能因?yàn)樾枰獁orker進(jìn)程未加載完成,所以并不包含需要的worker進(jìn)程?
這時(shí)就有可能會(huì)出現(xiàn)一個(gè)致命錯(cuò)誤:null調(diào)用了不存在的方法send()
?
因此需要修改一下這個(gè)判斷是否有可用worker的if判斷:
if ($this->_workerConnections) {
// 調(diào)用路由函數(shù),選擇一個(gè)worker把請(qǐng)求轉(zhuǎn)發(fā)給它
/** @var TcpConnection $worker_connection */
$worker_connection = call_user_func($this->router, $this->_workerConnections, $connection, $cmd, $body);
if (!$worker_connection) {
do {
$worker_connection = call_user_func($this->router, $this->_workerConnections, $connection, $cmd, $body);
} while(!$worker_connection);
}
if (false === $worker_connection->send($gateway_data)) {
$msg = "SendBufferToWorker fail. May be the send buffer are overflow. See http://wiki.workerman.net/Error2";
static::log($msg);
return false;
}
}
// 沒(méi)有可用的 worker麻煩walkor看看,希望在框架中修復(fù),這樣我們就不用侵入去修改框架的代碼,造成后續(xù)git更新框架的困擾
感謝你的建議,
if (!$worker_connection) {
do {
$worker_connection = call_user_func($this->router, $this->_workerConnections, $connection, $cmd, $body);
} while(!$worker_connection);
}
不過(guò)這個(gè)代碼無(wú)法解決你說(shuō)的這個(gè)問(wèn)題。原因是進(jìn)程執(zhí)行在這個(gè)死循環(huán)時(shí),這些參數(shù) $this->router
, $this->_workerConnections
, $connection
, $cmd
, $body
是不變的,尤其是$this->_workerConnections
不會(huì)有變化,這會(huì)導(dǎo)致gateway進(jìn)程cpu100%,導(dǎo)致服務(wù)永遠(yuǎn)無(wú)法使用。
?
框架能優(yōu)化的只能是判斷下?$worker_connection 是否為空,如果為空就不調(diào)用send,并記錄一個(gè)日志。
?
?