亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > MySQL > 正文

PHP連接MySql閃斷自動重連的方法

2024-07-24 13:10:24
字體:
來源:轉載
供稿:網友

使用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

<?php// 數據庫操作類class DB{// 保存數據庫連接private static $_instance = null;// 連接數據庫public static function get_conn($config){if(isset(self::$_instance) && !empty(self::$_instance)){return self::$_instance;}$dbhost = $config['host'];$dbname = $config['dbname'];$dbuser = $config['user'];$dbpasswd = $config['password'];$pconnect = $config['pconnect'];$charset = $config['charset'];$dsn = "mysql:host=$dbhost;dbname=$dbname;";try {$h_param = array(PDO::ATTR_ERRMODE => 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

<?phprequire 'db.php';// 數據庫設定$config = array('host' => '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

<?php// 數據庫操作類class DB{// 保存數據庫連接private static $_instance = null;// 連接數據庫public static function get_conn($config){if(isset(self::$_instance) && !empty(self::$_instance)){return self::$_instance;}$dbhost = $config['host'];$dbname = $config['dbname'];$dbuser = $config['user'];$dbpasswd = $config['password'];$pconnect = $config['pconnect'];$charset = $config['charset'];$dsn = "mysql:host=$dbhost;dbname=$dbname;";try {$h_param = array(PDO::ATTR_ERRMODE => 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...

以上所述是小編給大家介紹的PHP連接MySql閃斷自動重連的方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對VeVb武林網網站的支持!


注:相關教程知識閱讀請移步到MYSQL教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲精品在线不卡| 亚洲美女性生活视频| 91久久久久久久久久久久久| 久久精品电影网站| 亚洲欧洲在线观看| 国内外成人免费激情在线视频| 精品少妇一区二区30p| 久久精品国产91精品亚洲| 国产精品99久久久久久久久| 亚洲无线码在线一区观看| 亚洲3p在线观看| 国产精品大片wwwwww| 成人免费黄色网| 日韩欧美一区二区在线| 亚洲国产成人91精品| 国产亚洲a∨片在线观看| 精品无人国产偷自产在线| 国产精品激情av电影在线观看| 国内精品久久久久影院 日本资源| 91色在线观看| 欧美伊久线香蕉线新在线| 91产国在线观看动作片喷水| 97在线观看视频| 亚洲精品电影网| 在线观看免费高清视频97| 国产精品一区二区女厕厕| 国产69精品99久久久久久宅男| 成人午夜在线视频一区| 日本免费在线精品| 国产精品视频永久免费播放| 久久视频在线看| 午夜精品一区二区三区av| 亚洲国模精品私拍| 深夜福利91大全| 欧美剧在线观看| 久久久人成影片一区二区三区| 久久久久久免费精品| 亚洲亚裔videos黑人hd| 亚洲第一精品自拍| 欧美精品成人91久久久久久久| 欧美激情国产日韩精品一区18| 日本乱人伦a精品| 欧美性猛交xxxxx水多| 日韩精品视频三区| 欧美午夜www高清视频| 亚洲性视频网址| 精品国产一区av| 久久久久五月天| 97久久精品国产| 久久久中精品2020中文| 久久久久久久久亚洲| 亚洲大胆美女视频| 青草青草久热精品视频在线网站| 国产婷婷成人久久av免费高清| 亚洲精品一区二区三区不| 伊人伊人伊人久久| 丝袜美腿精品国产二区| 欧美精品一区三区| 九九热这里只有在线精品视| 成人h猎奇视频网站| 免费99精品国产自在在线| 按摩亚洲人久久| 这里只有精品视频在线| 美女视频久久黄| 国产精品高潮呻吟久久av野狼| 国产色婷婷国产综合在线理论片a| 精品色蜜蜜精品视频在线观看| 夜夜嗨av色综合久久久综合网| 中文字幕久久精品| 国产精品成人免费电影| 日韩在线精品视频| 欧美亚洲国产视频小说| 欧美老女人bb| 久久精品99久久香蕉国产色戒| 欧美精品videosex极品1| 日韩欧美在线中文字幕| 精品国产欧美一区二区三区成人| 亚洲天堂2020| 日韩av在线不卡| 亚洲美女免费精品视频在线观看| 久久精品国产成人精品| 在线视频日韩精品| 国产日韩欧美综合| 欧美激情综合亚洲一二区| 97人人爽人人喊人人模波多| 日韩69视频在线观看| 久久这里有精品视频| 欧美最猛性xxxxx(亚洲精品)| 成人a在线视频| 一区二区三区四区视频| 欧美裸体男粗大视频在线观看| 91亚洲精品久久久| 精品久久久久久久久久ntr影视| 欧美日韩在线一区| 亚洲第一福利网| 91久热免费在线视频| 91爱爱小视频k| 亚洲精品久久久久中文字幕二区| 国产91免费看片| 欧美黄色性视频| 国产欧美日韩免费| 久久久国产影院| 国产有码在线一区二区视频| 狠狠色狠色综合曰曰| 久久深夜福利免费观看| 性色av一区二区三区免费| 国产亚洲精品综合一区91| 亚洲一区二区在线| 国产精品一区二区三区久久| 欧亚精品中文字幕| 亚洲欧美国产精品久久久久久久| 国产精品爽黄69天堂a| 欧美日韩国产第一页| 亚洲精品自在久久| 亚洲美腿欧美激情另类| 亚洲第一网站免费视频| 一区二区av在线| 国产精品99久久久久久人| 亚洲精品91美女久久久久久久| 欧美激情高清视频| 国产精品视频精品| 亚洲bt天天射| 国产精品情侣自拍| 国产成人自拍视频在线观看| 国产精品久久97| 中文字幕精品国产| 国产欧美 在线欧美| 丝袜亚洲另类欧美重口| 久久精品电影网| 91高清视频在线免费观看| 欧美激情精品久久久久久| 国产欧美韩国高清| 国产91精品视频在线观看| 欧美日韩亚洲一区二区三区| 欧美日韩一区二区免费视频| 欧美激情久久久久| 精品国产31久久久久久| 色中色综合影院手机版在线观看| 亚洲品质视频自拍网| 97婷婷大伊香蕉精品视频| 亚洲人在线观看| 亚洲一区二区久久久久久久| 日韩av在线一区| 夜色77av精品影院| 日韩欧美高清在线视频| 久久精品久久久久久国产 免费| 欧美美最猛性xxxxxx| 国产色婷婷国产综合在线理论片a| 久久久久久久久久婷婷| 欧美激情第99页| 全色精品综合影院| 亚洲国产高清福利视频| 蜜月aⅴ免费一区二区三区| 亚洲精品国产精品自产a区红杏吧| 欧美一区二区三区……| 欧美亚洲在线播放| 午夜精品在线视频| 欧美裸体xxxx极品少妇| 中文字幕欧美精品日韩中文字幕| 欧美精品久久久久a| 亚洲精品乱码久久久久久金桔影视| 亚洲美女黄色片| 国产91精品久久久久| 中文字幕精品影院|