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


Posted in PHP onApril 03, 2017

mysql_ping() 检查到服务器的连接是否正常。如果到服务器的连接可用,则返回true,否则返回false。

但PDO不支持mysql_ping()方法,因此需要自己编写代码模拟mysql_ping()方法,检查连接是否可用。

代码如下:

<?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、创建测试数据表

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、演示文件

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;
  }

  // 重置连接
  public static function reset_connect(){
    self::$_instance = null;
  }

}
?>

test.php

<?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 模拟闪断

mysql.server stop
Shutting down MySQL
.... SUCCESS! 
mysql.server start
Starting MySQL
 SUCCESS!

执行输出:

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判断连接是否可用的实现方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
Ajax PHP 边学边练 之三 数据库
Nov 26 PHP
php下关于Cannot use a scalar value as an array的解决办法
Aug 08 PHP
phpMyAdmin 链接表的附加功能尚未激活问题的解决方法(已测)
Mar 27 PHP
php抓取页面的几种方法详解
Jun 17 PHP
在Ubuntu 14.04上部署 PHP 环境及 WordPress
Sep 02 PHP
php微信支付之APP支付方法
Mar 04 PHP
使用URL传输SESSION信息
Jul 14 PHP
PHP Header失效的原因分析及解决方法
Nov 16 PHP
Windows平台实现PHP连接SQL Server2008的方法
Jul 26 PHP
php数据库的增删改查 php与javascript之间的交互
Aug 31 PHP
Yii1.1框架实现PHP极光推送消息通知功能
Sep 06 PHP
php连接sftp的作用以及实例代码
Sep 23 PHP
php 调用ffmpeg获取视频信息的简单实现
Apr 03 #PHP
php文件包含目录配置open_basedir的使用与性能详解
Apr 03 #PHP
thinkphp关于简单的权限判定方法
Apr 03 #PHP
[原创]php使用strpos判断字符串中数字类型子字符串出错的解决方法
Apr 01 #PHP
PHP 实现字符串翻转(包含中文汉字)的实现代码
Apr 01 #PHP
thinkphp自定义权限管理之名称判断方法
Apr 01 #PHP
浅谈ThinkPHP中initialize和construct的区别
Apr 01 #PHP
You might like
PHP+MySQL实现无极限分类栏目的方法
2015/12/23 PHP
Jquery 高亮显示文本中重要的关键字
2009/12/24 Javascript
关于全局变量和局部变量的那些事
2013/01/11 Javascript
js弹出窗口之弹出层的小例子
2013/06/17 Javascript
ExtJS自定义主题(theme)样式详解
2013/11/18 Javascript
jquery validate 自定义验证方法介绍 日期验证
2014/02/27 Javascript
javascript跨域的4种方法和原理详解
2014/04/08 Javascript
jquery css 设置table的奇偶行背景色示例
2014/06/03 Javascript
Jquery节点遍历next与nextAll方法使用示例
2014/07/22 Javascript
jquery实现图片随机排列的方法
2015/05/04 Javascript
AngularJs  Creating Services详解及示例代码
2016/09/02 Javascript
jQuery的 $.ajax防止重复提交的两种方法(推荐)
2016/10/14 Javascript
JavaScript模板引擎Template.js使用详解
2016/12/15 Javascript
JavaScript中的return布尔值的用法和原理解析
2017/08/14 Javascript
详解webpack的配置文件entry与output
2017/08/21 Javascript
vue中如何实现pdf文件预览的方法
2018/07/12 Javascript
性能优化篇之Webpack构建速度优化的建议
2019/04/03 Javascript
[02:53]DOTA2英雄昆卡基础教程
2013/11/25 DOTA
[32:17]完美世界DOTA2联赛循环赛LBZS vs Forest第二场 10月30日
2020/10/31 DOTA
分享一下Python 开发者节省时间的10个方法
2015/10/02 Python
Python内建数据结构详解
2016/02/03 Python
深入理解NumPy简明教程---数组2
2016/12/17 Python
python3.7.0的安装步骤
2018/08/27 Python
基于django channel实现websocket的聊天室的方法示例
2019/04/11 Python
python实现可变变量名方法详解
2019/07/01 Python
关于pytorch多GPU训练实例与性能对比分析
2019/08/19 Python
Python使用uuid库生成唯一标识ID
2020/02/12 Python
Python私有属性私有方法应用实例解析
2020/09/15 Python
Tom Dixon官网:英国照明及家具设计和制造公司
2019/03/01 全球购物
房地产推广策划方案
2014/05/19 职场文书
学雷锋标兵事迹材料
2014/08/18 职场文书
2014年平安夜寄语
2014/12/08 职场文书
技术员个人工作总结
2015/03/03 职场文书
岁月神偷观后感
2015/06/11 职场文书
本科毕业论文答辩稿
2015/06/23 职场文书
如何判断pytorch是否支持GPU加速
2021/06/01 Python