千家信息网

PHP连接MySql闪断自动重连的方法

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,使用php作为后台运行程序(例如短信群发),在cli模式下执行php,php需要连接mysql循环执行数据库处理。当mysql连接闪断时,之后循环的执行将会失败。我们需要设计一个方法,当mysql闪断
千家信息网最后更新 2026年11月01日PHP连接MySql闪断自动重连的方法

使用php作为后台运行程序(例如短信群发),在cli模式下执行php,php需要连接mysql循环执行数据库处理。

当mysql连接闪断时,之后循环的执行将会失败。

我们需要设计一个方法,当mysql闪断时,可以自动重新连接,使后面的程序可以正常执行下去。

1.创建测试数据表

CREATE TABLE `user` (`id` int(11) unsigned NOT NULL AUTO_INCREMENT,`name` varchar(20) NOT NULL,PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;

2.插入测试数据

insert into user(name) values('fdipzone'),('xfdipzone'),('terry');mysql> select * from user;+----+-----------+| id | name |+----+-----------+| 1 | fdipzone || 2 | xfdipzone || 3 | terry |+----+-----------+

3.后台运行的php文件

db.php

 PDO::ERRMODE_EXCEPTION,);if ($charset != '') {$h_param[PDO::MYSQL_ATTR_INIT_COMMAND] = 'SET NAMES ' . $charset; //設置默認編碼}if ($pconnect) {$h_param[PDO::ATTR_PERSISTENT] = true;}$conn = new PDO($dsn, $dbuser, $dbpasswd, $h_param);} catch (PDOException $e) {throw new ErrorException('Unable to connect to db server. Error:' . $e->getMessage(), 31);}self::$_instance = $conn;return $conn;}// 执行查询public static function query($dbconn, $sqlstr, $condparam){$sth = $dbconn->prepare($sqlstr);try{$sth->execute($condparam);} catch (PDOException $e) {echo $e->getMessage().PHP_EOL;}$result = $sth->fetchAll(PDO::FETCH_ASSOC);return $result;}}?>

test.php

 'localhost','dbname' => 'user','user' => 'root','password' => '','pconnect' => 0,'charset' => '');// 循环执行while(true){// 创建数据连接$dbconn = DB::get_conn($config);// 执行查询$sqlstr = 'select * from user where id=?';$condparam = array(mt_rand(1,3));$data = DB::query($dbconn, $sqlstr, $condparam);print_r($data);// 延时10秒echo 'sleep 10'.PHP_EOL.PHP_EOL;sleep(10);}?>

4.执行步骤

在php cli模式下执行test.php,然后马上执行mysql.server stop 与 mysql.server start 模拟闪断

mysql.server stopShutting down MySQL.. SUCCESS!mysql.server startStarting MySQLSUCCESS!

可以看到,闪断后不能重新连接数据库,后面的程序不能执行下去。

Array([0] => Array([id] => 3[name] => terry))sleep 10SQLSTATE[HY000]: General error: 2006 MySQL server has gone awayArray()sleep 10SQLSTATE[HY000]: General error: 2006 MySQL server has gone awayArray()sleep 10...

5.增加重连机制

if(isset(self::$_instance) && !empty(self::$_instance)){return self::$_instance;}

闪断后,因为 self::$_instance 的值存在,因此调用get_conn并不会重新连接,而是使用保存的连接进行处理。

这样实际上是当连接存在时,不需要再次创建mysql连接,减少mysql连接数。

所以需要在闪断后,清空self::$_instance的值,使下次重新获取连接,而不使用已经创建但失效的数据库连接。

改进方法如下:

增加reset_connect方法,当出现错误时调用。如果判断错误是MySQL server has gone away则清空已经存在的数据库连接,清空后下次则会重新连接mysql。

修改后的php文件如下:

db.php

 PDO::ERRMODE_EXCEPTION,);if ($charset != '') {$h_param[PDO::MYSQL_ATTR_INIT_COMMAND] = 'SET NAMES ' . $charset; //設置默認編碼}if ($pconnect) {$h_param[PDO::ATTR_PERSISTENT] = true;}$conn = new PDO($dsn, $dbuser, $dbpasswd, $h_param);} catch (PDOException $e) {throw new ErrorException('Unable to connect to db server. Error:' . $e->getMessage(), 31);}self::$_instance = $conn;return $conn;}// 执行查询public static function query($dbconn, $sqlstr, $condparam){$sth = $dbconn->prepare($sqlstr);try{$sth->execute($condparam);} catch (PDOException $e) {echo $e->getMessage().PHP_EOL;self::reset_connect($e->getMessage()); // 出错时调用重置连接}$result = $sth->fetchAll(PDO::FETCH_ASSOC);return $result;}// 重置连接public static function reset_connect($err_msg){if(strpos($err_msg, 'MySQL server has gone away')!==false){self::$_instance = null;}}}?>

6.再次进行闪断执行

可以看到改进后的效果,闪断后,当前执行的会失败,但之后的可以重新创建新连接继续执行下去。

Array([0] => Array([id] => 2[name] => xfdipzone))sleep 10SQLSTATE[HY000]: General error: 2006 MySQL server has gone awayArray()sleep 10Array([0] => Array([id] => 1[name] => fdipzone))sleep 10...

文章同步发布: https://www.geek-share.com/detail/2683442734.html

数据 数据库 方法 程序 循环 查询 再次 后台 文件 时调 模式 错误 处理 测试 运行 实际 实际上 效果 数据表 文章 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 上海睿民互联网科技有限公司 国智互联网科技 智能科技公司是互联网公司吗 金诺互联网科技 互联网科技战争 互联网科技与金融科技 深圳互联网络科技有限公司 一五八零互联网科技 海南科技产业互联网平台 老年人脱离互联网科技的作文 现代科技和互联网有关系吗 浙江互联网科技研学营 注册互联网科技公司经营范围大全 长沙互联网科技 2021互联网科技公司排名 雨阳互联网卡科技有限公司 杭州披云加互联网科技有限公司 科技互联网行业投资研究 江苏互联网智能科技产品出厂价 知域互联网科技有限公司官网 互联网高科技 美国互联网科技 互联网科技公司有哪些 互联网科技中介 团飞科技与伯堂互联网服务平台 深圳市罗太互联网科技有限公司 高科技互联网发展前景如何 宇信科技在杭州互联网排第几 卡尔迅互联网科技有限公司 南京一网一红互联网科技有限公司
0