天天看点

php pdo 判断是否连接,php PDO判断连接是否可用的实现方法

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