php PDO判斷連接配接是否可用的實作方法
這裡有新鮮出爐的 PHP 設計模式,程式狗速度看過來!
PHP 開源腳本語言
PHP(外文名: Hypertext Preprocessor,中文名:"超文本預處理器")是一種通用開源腳本語言。文法吸收了 C 語言、Java 和 Perl 的特點,入門門檻較低,易于學習,使用廣泛,主要适用于 web 開發領域。PHP 的檔案字尾名為 php。
下面小編就為大家帶來一篇 php PDO 判斷連接配接是否可用的實作方法。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟随小編過來看看吧
mysql_ping() 檢查到伺服器的連接配接是否正常。如果到伺服器的連接配接可用,則傳回 true,否則傳回 false。
但 PDO 不支援 mysql_ping() 方法,是以需要自己編寫代碼模拟 mysql_ping() 方法,檢查連接配接是否可用。
代碼如下:
functionpdo_ping($dbconn){
try{
$dbconn->getAttribute(PDO::ATTR_SERVER_INFO);
}catch(PDOException$e){
if(strpos($e->getMessage(),'MySQL server has gone away')!==false){
returnfalse;
}
}
returntrue;
}
?>
代碼示範:
1、建立測試資料表
CREATE TABLE`user`(
`id`int(11)unsignedNOT NULL AUTO_INCREMENT,
`name`varchar(20)NOT NULL,
PRIMARY KEY(`id`)
)ENGINE=InnoDBDEFAULT CHARSET=utf8;
2、插入測試資料
insertintouser(name)values('fdipzone'),('xfdipzone'),('terry');
mysql>select*fromuser;
+----+-----------+
|id|name|
+----+-----------+
|1|fdipzone|
|2|xfdipzone|
|3|terry|
+----+-----------+
3、示範檔案
db.php
// 資料庫操作類
classDB{
// 儲存資料庫連接配接
privatestatic$_instance=null;
// 連接配接資料庫
publicstaticfunctionget_conn($config){
if(isset(self::$_instance)&&!empty(self::$_instance)){
returnself::$_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=newPDO($dsn,$dbuser,$dbpasswd,$h_param);
}catch(PDOException$e){
thrownewErrorException('Unable to connect to db server. Error:'.$e->getMessage(),31);
}
self::$_instance=$conn;
return$conn;
}
// 執行查詢
publicstaticfunctionquery($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;
}
// 重置連接配接
publicstaticfunctionreset_connect(){
self::$_instance=null;
}
}
?>
test.php
require'db.php';
// 資料庫設定
$config=array(
'host'=>'localhost',
'dbname'=>'user',
'user'=>'root',
'password'=>'',
'pconnect'=>0,
'charset'=>''
);
// 循環執行
while(true){
// 建立資料連接配接
$dbconn=DB::get_conn($config);
// 判斷連接配接是否有效
$status=pdo_ping($dbconn);
if($status){
echo'connect ok'.PHP_EOL;
}else{
echo'connect failure'.PHP_EOL;
// 重置連接配接
DB::reset_connect();
$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);
}
functionpdo_ping($dbconn){
try{
$dbconn->getAttribute(PDO::ATTR_SERVER_INFO);
}catch(PDOException$e){
if(strpos($e->getMessage(),'MySQL server has gone away')!==false){
returnfalse;
}
}
returntrue;
}
?>
4、執行
在 php cli 模式下執行 test.php,然後馬上執行 mysql.server stop 與 mysql.server start 模拟閃斷
mysql.server stop
ShuttingdownMySQL
....SUCCESS!
mysql.server start
StartingMySQL
SUCCESS!
執行輸出:
connect ok
Array
(
[0]=>Array
(
[id]=>2
[name]=>xfdipzone
)
)
sleep10
connect failure
Array
(
[0]=>Array
(
[id]=>3
[name]=>terry
)
)
sleep10
connect ok
Array
(
[0]=>Array
(
[id]=>3
[name]=>terry
)
)
sleep10
可以看到閃斷後,pdo_ping() 傳回 false,連接配接失敗,然後調用自動重連,保證後面的查詢能繼續執行。
以上這篇 php PDO 判斷連接配接是否可用的實作方法就是小編分享給大家的全部内容了,希望能給大家一個參考,也希望大家多多支援 PHPERZ。
來源: http://www.phperz.com/article/17/0807/340261.html