PHP连接MySql闪断自动重连的方法
发表于:2025-01-20 作者:千家信息网编辑
千家信息网最后更新 2025年01月20日,使用php作为后台运行程序(例如短信群发),在cli模式下执行php,php需要连接mysql循环执行数据库处理。当mysql连接闪断时,之后循环的执行将会失败。我们需要设计一个方法,当mysql闪断
千家信息网最后更新 2025年01月20日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安全错误
数据库的锁怎样保障安全
热门的网络技术有哪些
徐州软件开发外包公司
flybase数据库
虚拟游戏服务器
网络安全短视频封面
实时监控网络技术服务
观看第五空间网络安全简报
dna服务器推荐
北邮数据库课程设计
美国大学使用学术数据库收费吗
国内网络安全问题
适时修订有关网络安全
山东春考信息技术网络技术
数据库闭包咋算
电商erp软件开发哪家正规
学习网络安全需要数学好吗
数据库地位作用
江苏服务器维修调试云空间
中国的根域名服务器
服务器怎么传数据到网页上
延庆区信息化网络技术服务优点
数据库电话号用什么类型
网络安全认证报告三级
云界软件开发
电信网络安全手抄报图片
大数据服务器有哪些硬件
吴中区创新软件开发报价方案
数据库闭包咋算
刺客信条3服务器自动退出
山西现代化软件开发价格对比