Thinkphp 数据库断链问题处理
这个奇葩问题,我极端怀疑是红色掐断,也有可能是机房的奇葩问题(可我阿里云腾讯云也试过)
下面就让我来讲诉一下这个事情的奇妙经历把
机器环境配置
- 机器配置 16h 16g 100m
- MySQL 10.3.12-MariaDB
- Php 7.3.2
- Thinkphp 5.1
- Nginx 1.17
某日我日常运维巡查日志的发现了很随缘的数据库断链报错,但是客服团队那边并没有反馈过这个问题(估计不是很频繁出现吧)。
Thinkphp 报错信息如下
[2019-05-30T18:37:37+08:00] *.*.*.* POST *
[ ERROR ] [MYSQL] Connection refused
有时候也有可能是下列断链提示
- MySQL server has gone away
- Connection timed out
这个奇葩错误是我网站机器与数据库机器分离后才出现的奇葩问题(所以说本地127.0.0.1是不会抽风的
)。
哪怕机器是同一个机房相同内网也会出现这种奇葩情况。
这里开始就可能有人说,是不是你数据库配置有问题。我只能告诉你。。。我试过换回3306端口 超时拉到最高,访问同是在线拉到最高依然无果,当然是重启过数据库也这样。
那个时候,我已经深知可能是红色掐断
,当时想到的解决办法只有搞个长连接数据库连接池,但是PHP搞个这样的玩意谈何容易。。。
经过我不断大量测试压测,发现Thinkphp的自动重连机制只能是用于已经链接了但是多次查询后突然断链才能重连。
如果是一开始就链接失败是不会重连的,并且我测试过红色掐断
只要你重连他过很久才会再次随机掐断。
所以解决版本如下(适用与Thinkphp5.1 其他版本自行变通)
项目地址thinkphplibrarythinkdbConnection.php 528行开始的链接代码开始改
try {
$this->links[$linkNum] = new PDO($config['dsn'], $config['username'], $config['password'], $params);
} catch (Exception $e) {
$this->links[$linkNum] = new PDO($config['dsn'], $config['username'], $config['password'], $params);
}
我的解决办法比较暴力就是加多了一个Try