发布于 4年前

ThinkPHP5.0.*版本 cli模式下php每隔段时间就出错

关于ThinkPHP5.0.*版本 cli模式下php每隔段时间就出错
cli模式下php每隔段时间就出错
官方论坛
日志如下:

控制台

Uncaught thinkexceptionErrorException: Error while sending STMT_CLOSE packet. PID=23951 in /www/web/work/public_html/thinkphp/library/think/db/Connection.php:318

log文件

thinkdbConnection::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.官方推荐使用最新版本以解决此问题

PHP
©2020 edoou.com   京ICP备16001874号-3