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互联网科技公司排名
雨阳互联网卡科技有限公司
杭州披云加互联网科技有限公司
科技互联网行业投资研究
江苏互联网智能科技产品出厂价
知域互联网科技有限公司官网
互联网高科技
美国互联网科技
互联网科技公司有哪些
互联网科技中介
团飞科技与伯堂互联网服务平台
深圳市罗太互联网科技有限公司
高科技互联网发展前景如何
宇信科技在杭州互联网排第几
卡尔迅互联网科技有限公司
南京一网一红互联网科技有限公司