在項目運行中遇到不定時出現這個問題,目前已解決,問題如下:
?Gateway.php:372
if ($this->_workerConnections) {
// 調用路由函數,選擇一個worker把請求轉發(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;
}
}
// 沒有可用的 worker此時判斷了$this->_workerConnections是否為真,如果為真就去調用了路由函數
?
如果此時reload,用戶有多個worker進程,并且自定義了路由,需要把用戶路由到特定worker進程
?
那么此時在$this->_workerConnections中很有可能不是全部已啟動好的worker
其中可能因為需要worker進程未加載完成,所以并不包含需要的worker進程?
這時就有可能會出現一個致命錯誤:null調用了不存在的方法send()
?
因此需要修改一下這個判斷是否有可用worker的if判斷:
if ($this->_workerConnections) {
// 調用路由函數,選擇一個worker把請求轉發(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;
}
}
// 沒有可用的 worker麻煩walkor看看,希望在框架中修復,這樣我們就不用侵入去修改框架的代碼,造成后續(xù)git更新框架的困擾
感謝你的建議,
if (!$worker_connection) {
do {
$worker_connection = call_user_func($this->router, $this->_workerConnections, $connection, $cmd, $body);
} while(!$worker_connection);
}
不過這個代碼無法解決你說的這個問題。原因是進程執(zhí)行在這個死循環(huán)時,這些參數 $this->router
, $this->_workerConnections
, $connection
, $cmd
, $body
是不變的,尤其是$this->_workerConnections
不會有變化,這會導致gateway進程cpu100%,導致服務永遠無法使用。
?
框架能優(yōu)化的只能是判斷下?$worker_connection 是否為空,如果為空就不調用send,并記錄一個日志。
?
?