1. 程式人生 > >ThinkPHP5.0.*版本 cli模式下php每隔段時間就出錯

ThinkPHP5.0.*版本 cli模式下php每隔段時間就出錯

關於ThinkPHP5.0.*版本 cli模式下php每隔段時間就出錯

cli模式下php每隔段時間就出錯
官方論壇
日誌如下:

# 控制檯
Uncaught think\exception\ErrorException: Error while sending STMT_CLOSE packet. PID=23951 in /www/web/work/public_html/thinkphp/library/think/db/Connection.php:318
# log檔案
think\db\Connection::free(): send of 9 bytes failed with errno=32 Broken pipe

分析原因

# 長時間資料庫會斷線 但是新版本會改進斷線重連機制

解決方案

# 1.臨時解決
# 修改/thinkphp/library/think/db/Connection.php
# 1.1是否需要斷線重連
'break_reconnect' => true,
# 1.2 釋放查詢結果 捕獲異常
public function free()
{
    try {
        $this->PDOStatement = null;
    } catch (Exception $e) {
        Log::write("has error when free PDOStatement maybe mysql gone away,skip it:" . $e->getMessage(), log::DEBUG);
    }
}
# 1.3 是否斷線,修改為master最新
protected function isBreak($e)
{
    if (!$this->config['break_reconnect']) {
        return false;
    }

    $info = [
        'server has gone away',
        'no connection to the server',
        'Lost connection',
        'is dead or not enabled',
        'Error while sending',
        'decryption failed or bad record mac',
        'server closed the connection unexpectedly',
        'SSL connection has been closed unexpectedly',
        'Error writing data to the connection',
        'Resource deadlock avoided',
        'failed with errno',
        'send of 33 bytes failed with errno=32 Broken pipe',
    ];

    $error = $e->getMessage();

    foreach ($info as $msg) {
        if (false !== stripos($error, $msg)) {
            return true;
        }
    }
    return false;
}
# 2.官方推薦使用最新版本以解決此問題