国产+高潮+在线,国产 av 仑乱内谢,www国产亚洲精品久久,51国产偷自视频区视频,成人午夜精品网站在线观看

Gateway異常退出問題及解決方案

zzz

在項目運行中遇到不定時出現這個問題,目前已解決,問題如下:
?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更新框架的困擾

3964 2 0
2個回答

walkor 打賞

感謝你的建議,

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,并記錄一個日志。
?
?

  • 暫無評論
zzz

謝謝回復,那是否能將發(fā)送失敗的消息放入一個隊列,后續(xù)按一定的重試次數重試發(fā)送,如果重試成功或者重試失敗一定次數就移除消息呢

  • walkor 2019-07-19

    可以的,你們可以自己加個

年代過于久遠,無法發(fā)表回答
??