php PDO判断连接是否可用的实现方法
这里有新鲜出炉的 PHP 设计模式,程序狗速度看过来!
PHP 开源脚本语言
PHP(外文名: Hypertext Preprocessor,中文名:"超文本预处理器")是一种通用开源脚本语言。语法吸收了 C 语言、Java 和 Perl 的特点,入门门槛较低,易于学习,使用广泛,主要适用于 web 开发领域。PHP 的文件后缀名为 php。
下面小编就为大家带来一篇 php PDO 判断连接是否可用的实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
mysql_ping() 检查到服务器的连接是否正常。如果到服务器的连接可用,则返回 true,否则返回 false。
但 PDO 不支持 mysql_ping() 方法,因此需要自己编写代码模拟 mysql_ping() 方法,检查连接是否可用。
代码如下:
/**
* 检查连接是否可用
* @param Link $dbconn 数据库连接
* @return Boolean
*/
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);
}
/**
* 检查连接是否可用
* @param Link $dbconn 数据库连接
* @return Boolean
*/
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