PHP连接MySql闪断自动重连的方法
发表于:2025-11-07 作者:千家信息网编辑
千家信息网最后更新 2025年11月07日,使用php作为后台运行程序(例如短信群发),在cli模式下执行php,php需要连接mysql循环执行数据库处理。当mysql连接闪断时,之后循环的执行将会失败。我们需要设计一个方法,当mysql闪断
千家信息网最后更新 2025年11月07日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安全错误
数据库的锁怎样保障安全
无锡编程软件开发机构
delphi7数据库李维
扬州网络安全宣传平台
事业单位网络技术工程考什么
知行管理服务器安装
威力网络技术欢迎选购
网络安全态势感知平台 厂家
本机的服务器管理器在哪
网络安全职业发展定位
电大数据库应用技术简答题
软件开发团队复杂
徐州软件开发求职
电信公司网络安全隐患
网站怎么插入数据库
电脑城网络技术周记
医疗预约软件开发
不安全的数据库配置文件
茅台库存软件开发
麒麟水浒传游戏有几个服务器
数据库有必要建立关系吗
中专对口升学分数线网络技术
网络安全交互式巡警系统
数据库服务器文件管理
关系型数据库最多存取记录
公司服务器中病毒如何清理
管理系统服务器支持热插播
2008r2数据库tp配置
aix 查看数据库版本号
深圳元征软件开发有限公司
安徽pdu服务器电源出售