tp5.1 队列报错解决

2022-09-02 17:42:55 +08:00
 awanganddong

项目是 tp5.1

队列报下边这个错误

Error while sending STMT_CLOSE packet. PID=10471

网上搜索资料是断线重连的问题,但断线重连是设置的。

引起这个问题的 sql 报错有下边这些

PDO::prepare(): send of 93 bytes failed with errno=110 Connection timed out

think\db\Connection::free(): send of 9 bytes failed with errno=110 Connection timed out

所以想问下此类问题如何解决。

      try {
            // 调试开始
            $this->debug(true);

            // 预处理
            $this->PDOStatement = $this->linkID->prepare($sql);

            // 是否为存储过程调用
            $procedure = in_array(strtolower(substr(trim($sql), 0, 4)), ['call', 'exec']);

            // 参数绑定
            if ($procedure) {
                $this->bindParam($bind);
            } else {
                $this->bindValue($bind);
            }

            // 执行查询
            $this->PDOStatement->execute();

            // 调试结束
            $this->debug(false, '', $master);

            // 返回结果集
            return $this->getResult($pdo, $procedure);
        } catch (\PDOException $e) {
            if ($this->isBreak($e)) {
                return $this->close()->query($sql, $bind, $master, $pdo);
            }

            throw new PDOException($e, $this->config, $this->getLastsql());
        } catch (\Throwable $e) {
            if ($this->isBreak($e)) {
                return $this->close()->query($sql, $bind, $master, $pdo);
            }

            throw $e;
        } catch (\Exception $e) {
            if ($this->isBreak($e)) {
                return $this->close()->query($sql, $bind, $master, $pdo);
            }

            throw $e;
        }
1859 次点击
所在节点    PHP
7 条回复
paranoiall
2022-09-02 18:58:14 +08:00
数据库配置 增加 'break_reconnect' => true 试试
awanganddong
2022-09-02 19:17:18 +08:00
@paranoiall 这个配置已经设置了
imxieke
2022-09-03 02:40:06 +08:00
你是把数据库用来做队列么
可以检查下数据库那台服务器是不是性能问题造成的无法连接
NoahVI
2022-09-09 14:30:32 +08:00
这个报错跟队列有什么关系。。我以为 mq 报错呢
awanganddong
2022-09-23 16:15:07 +08:00
@NoahVI 归根揭底是客户端 mysql 断开了链接,但是异常是抛在这个代码块里边,按照我的理解是反复进行断线重连,但是现在反而是直接排除异常,并打印了。
awanganddong
2022-09-23 20:39:03 +08:00
PHP7 如何使用 set_error_handler 和 set_exception_handler 处理异常机制


https://blog.csdn.net/zhang197093/article/details/75094816

//自定义的错误处理方法
function _error_handler($errno, $errstr ,$errfile, $errline)
{
echo "错误编号 errno: $errno".PHP_EOL;
echo "错误信息 errstr: $errstr".PHP_EOL;
echo "出错文件 errfile: $errfile".PHP_EOL;
echo "出错行号 errline: $errline".PHP_EOL;

}

set_error_handler('_error_handler', E_ALL | E_STRICT); // 注册错误处理方法来处理所有错误


try{
echo $foo['bar']; // 由于数组未定义,会产生一个 notice 级别的错误

trigger_error('人为触发一个错误', E_USER_ERROR); //人为触发错误

if (mt_rand(1, 10) > 5){
throw new Exception('This is a exception', 400); //抛出一个 Exception,看是否可以被 catch
}else{
foobar(3, 5); //调用未定义的方法将会产生一个 Error 级别的错误
}
}catch (Throwable $e){
echo "Error code: " . $e->getCode() .PHP_EOL;
echo "Error message: " . $e->getMessage() .PHP_EOL;
echo "Error file: " . $e->getFile() .PHP_EOL;
echo "Error fileline: " . $e->getLine() .PHP_EOL;
}

关于抛异常我的理解有问题
awanganddong
2022-10-09 12:08:30 +08:00
最新归档下,

现在可以断定是 mysql 主动断开链接,造成 pdo 报错

show variables like 'wait_timeout'
wait_timeout 28800

show VARIABLES like '%max_allowed_packet%'

max_allowed_packet 1073741824
slave_max_allowed_packet 1073741824


这是 mysql 配置

现在守护进程会进行断线重连,并且有重试功能。代码是可以正常进行的,但是有相关异常和报错日志。

现在异常和报错集中在三处地方,
系统日志,守护进程运行日志,队列重试日志。这三者之间有交集,但不相同。


追源码看的头疼

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/877310

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX