【PHP】关于守护进程报错:SQLSTATE[HY000]: General error: 2006 MySQL server has gone away

文章目录

概要

前段时间,公司的fastadmin项目要加入会员升级功能,我想可以把这些繁琐的升级判断做出守护进程,相当于丢到子线程中慢慢消化,肯定会提升代码执行效率。但完善了守护进程后,发现上线几天后,守护进程c操作了数据库,就开始报异常:SQLSTATE[HY000]: General error: 2006 MySQL server has gone away,一看这个错就是数据库连接出了问题。

技术细节

在fastadmin或者TP中,操作数据库一般用两种方式,一种是建model类,然后通过model对象操作数据库,还有一种方便快捷的方式,就是基于Db::name('table_name')的方式操作数据库,如果守护进程中这两种方式都涉及了,那么需要区分解决:

基于model类:

在database.php中加 :

php 复制代码
  'break_reconnect' => true,

📌 含义:

SQL 执行失败时,自动重连一次再执行

如果用Db::name的方式,可以在守护进程方法开始前,先运行一段代码:

php 复制代码
 try {
    Db::query("SELECT 1");
 } catch (\Exception $e) {
      Db::clear();
 }

实际作用是:

主动探测数据库连接是否还活着

SELECT 1 是最轻量的心跳 SQL

如果抛异常(比如 MySQL server has gone away)

说明当前 PDO 连接已经是 死连接

Db::clear()

清空 ThinkPHP 当前进程里缓存的连接

下一次 SQL 会 重新建连接

👉 在 常驻进程 / 长时间脚本 中,这是一个非常必要的防御手段。

相关推荐
XDHCOM21 小时前
ORA-32484重复列名错误,ORACLE数据库CYCLE子句故障修复与远程处理方案
数据库·oracle
Wenweno0o21 小时前
0基础Go语言Eino框架智能体实战-chatModel
开发语言·后端·golang
一博一言21 小时前
Oracle高版本Version_Count问题处理排查
oracle·dba
chenjingming66621 小时前
jmeter线程组设置以及串行和并行设置
java·开发语言·jmeter
cch891821 小时前
Python主流框架全解析
开发语言·python
不爱吃炸鸡柳21 小时前
C++ STL list 超详细解析:从接口使用到模拟实现
开发语言·c++·list
十五年专注C++开发1 天前
RTTR: 一款MIT 协议开源的 C++ 运行时反射库
开发语言·c++·反射
Momentary_SixthSense1 天前
设计模式之工厂模式
java·开发语言·设计模式
‎ദ്ദിᵔ.˛.ᵔ₎1 天前
STL 栈 队列
开发语言·c++
勿忘,瞬间1 天前
数据结构—顺序表
java·开发语言