pbootcms网站模板|日韩1区2区|织梦模板||网站源码|日韩1区2区|jquery建站特效-html5模板网

php PDO判斷連接是否可用的實現方法

下面小編就為大家帶來一篇php PDO判斷連接是否可用的實現方法。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

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判斷連接是否可用的實現方法就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持。

【網站聲明】本站除付費源碼經過測試外,其他素材未做測試,不保證完整性,網站上部分源碼僅限學習交流,請勿用于商業用途。如損害你的權益請聯系客服QQ:2655101040 給予處理,謝謝支持。

相關文檔推薦

下面小編就為大家帶來一篇PHP中關于PDO數據訪問抽象層的功能操作實例。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
PDO(php Data Object)是PHP的數據對象,它為PHP訪問數據庫提供了一種兼容一致的輕量級接口,也就是提供了一個數據庫訪問抽象層,這篇文章主要給大家介紹了關于PHP用PDO如何封裝簡單易用的
主站蜘蛛池模板: 建筑工程资质合作-工程资质加盟分公司-建筑资质加盟 | 电动车头盔厂家_赠品头盔_安全帽批发_山东摩托车头盔—临沂承福头盔 | 高压油管,液压接头,液压附件-烟台市正诚液压附件 | 海外整合营销-独立站营销-社交媒体运营_广州甲壳虫跨境网络服务 焊管生产线_焊管机组_轧辊模具_焊管设备_焊管设备厂家_石家庄翔昱机械 | 对夹式止回阀厂家,温州对夹式止回阀制造商--永嘉县润丰阀门有限公司 | 淘剧影院_海量最新电视剧,免费高清电影随心观看 | 企典软件一站式企业管理平台,可私有、本地化部署!在线CRM客户关系管理系统|移动办公OA管理系统|HR人事管理系统|人力 | 高光谱相机-近红外高光谱相机厂家-高光谱成像仪-SINESPEC 赛斯拜克 | WF2户外三防照明配电箱-BXD8050防爆防腐配电箱-浙江沃川防爆电气有限公司 | 上海防爆真空干燥箱-上海防爆冷库-上海防爆冷柜?-上海浦下防爆设备厂家? | 专业生产动态配料系统_饲料配料系统_化肥配料系统等配料系统-郑州鑫晟重工机械有限公司 | 河南橡胶接头厂家,河南波纹补偿器厂家,河南可曲挠橡胶软连接,河南套筒补偿器厂家-河南正大阀门 | 三佳互联一站式网站建设服务|网站开发|网站设计|网站搭建服务商 赛默飞Thermo veritiproPCR仪|ProFlex3 x 32PCR系统|Countess3细胞计数仪|371|3111二氧化碳培养箱|Mirco17R|Mirco21R离心机|仟诺生物 | 螺杆式冷水机-低温冷水机厂家-冷冻机-风冷式-水冷式冷水机-上海祝松机械有限公司 | 西门子气候补偿器,锅炉气候补偿器-陕西沃信机电工程有限公司 | 海尔生物医疗四川代理商,海尔低温冰箱四川销售-成都壹科医疗器械有限公司 | 苏州西装定制-西服定制厂家-职业装定制厂家-尺品服饰西装定做公司 | 真空搅拌机-行星搅拌机-双行星动力混合机-广州市番禺区源创化工设备厂 | 机械立体车库租赁_立体停车设备出租_智能停车场厂家_春华起重 | 土壤养分检测仪|土壤水分|土壤紧实度测定仪|土壤墒情监测系统-土壤仪器网 | 间甲酚,间甲酚厂家-山东祥东新材料 | 退火炉,燃气退火炉,燃气热处理炉生产厂家-丹阳市丰泰工业炉有限公司 | 皮带式输送机械|链板式输送机|不锈钢输送机|网带输送机械设备——青岛鸿儒机械有限公司 | 钢绞线万能材料试验机-全自动恒应力两用机-混凝土恒应力压力试验机-北京科达京威科技发展有限公司 | 生态板-实木生态板-生态板厂家-源木原作生态板品牌-深圳市方舟木业有限公司 | 无硅导热垫片-碳纤维导热垫片-导热相变材料厂家-东莞市盛元新材料科技有限公司 | 注浆压力变送器-高温熔体传感器-矿用压力传感器|ZHYQ朝辉 | 医养体检包_公卫随访箱_慢病随访包_家签随访包_随访一体机-济南易享医疗科技有限公司 | 流程管理|流程管理软件|企业流程管理|微宏科技-AlphaFlow_流程管理系统软件服务商 | 高压微雾加湿器_工业加湿器_温室喷雾-昌润空气净化设备 | EPK超声波测厚仪,德国EPK测厚仪维修-上海树信仪器仪表有限公司 | 电液推杆生产厂家|电动推杆|液压推杆-扬州唯升机械有限公司 | 科普仪器菏泽市教育教学仪器总厂| 上海办公室设计_办公楼,写字楼装修_办公室装修公司-匠御设计 | 小学教案模板_中学教师优秀教案_高中教学设计模板_教育巴巴 | elisa试剂盒价格-酶联免疫试剂盒-猪elisa试剂盒-上海恒远生物科技有限公司 | 商用绞肉机-熟肉切片机-冻肉切丁机-猪肉开条机 - 广州市正盈机械设备有限公司 | 华禹护栏|锌钢护栏_阳台护栏_护栏厂家-华禹专注阳台护栏、楼梯栏杆、百叶窗、空调架、基坑护栏、道路护栏等锌钢护栏产品的生产销售。 | 船用锚链|专业锚链生产厂家|安徽亚太锚链制造有限公司 | 【直乐】河北石家庄脊柱侧弯医院_治疗椎间盘突出哪家医院好_骨科脊柱外科专业医院_治疗抽动症/关节病骨伤权威医院|排行-直乐矫形中医医院 | 实验室隔膜泵-无油防腐蚀隔膜泵-耐腐蚀隔膜真空泵-杭州景程仪器 电杆荷载挠度测试仪-电杆荷载位移-管桩测试仪-北京绿野创能机电设备有限公司 |