mysql_ping() 检查到服务器的连接是否正常。如果到服务器的连接可用,则返回true,否则返回false。
但PDO不支持mysql_ping()方法,因此需要自己编写代码模拟mysql_ping()方法,检查连接是否可用。
代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
<?php
/**
* 检查连接是否可用
* @param Link $dbconn 数据库连接
* @return Boolean
*/
function pdo_ping( $dbconn ){
try {
$dbconn ->getAttribute(PDO::ATTR_SERVER_INFO);
} catch (PDOException $e ) {
if ( strpos ( $e ->getMessage(), 'MySQL server has gone away' )!==false){
return false;
}
}
return true;
}
?>
|
代码演示:
1、创建测试数据表
1
2
3
4
5
|
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、插入测试数据
1
2
3
4
5
6
7
8
9
10
|
insert into user(name) values( 'fdipzone' ),( 'xfdipzone' ),( 'terry' );
mysql> select * from user;
+----+-----------+
| id | name |
+----+-----------+
| 1 | fdipzone |
| 2 | xfdipzone |
| 3 | terry |
+----+-----------+
|
3、演示文件
db.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
<?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 ;
}
// 重置连接
public static function reset_connect(){
self:: $_instance = null;
}
}
?>
|
test.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
<?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
*/
function pdo_ping( $dbconn ){
try {
$dbconn ->getAttribute(PDO::ATTR_SERVER_INFO);
} catch (PDOException $e ) {
if ( strpos ( $e ->getMessage(), 'MySQL server has gone away' )!==false){
return false;
}
}
return true;
}
?>
|
4、执行
在php cli模式下执行test.php,然后马上执行mysql.server stop 与 mysql.server start 模拟闪断
1
2
3
4
5
6
|
mysql.server stop
Shutting down MySQL
.... SUCCESS!
mysql.server start
Starting MySQL
SUCCESS!
|
执行输出:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
connect ok
Array
(
[0] => Array
(
[id] => 2
[name] => xfdipzone
)
)
sleep 10
connect failure
Array
(
[0] => Array
(
[id] => 3
[name] => terry
)
)
sleep 10
connect ok
Array
(
[0] => Array
(
[id] => 3
[name] => terry
)
)
sleep 10
|
可以看到闪断后,pdo_ping()返回false,连接失败,然后调用自动重连,保证后面的查询能继续执行。
以上这篇php PDO判断连接是否可用的实现方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持服务器之家。