zoukankan      html  css  js  c++  java
  • php PDO判断连接是否可用的方法

    转载自:傲雪星枫  原文地址: http://blog.csdn.net/fdipzone/article/details/53117541

    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,连接失败,然后调用自动重连,保证后面的查询能继续执行。

  • 相关阅读:
    质量属性论文
    四月份-读书笔记 构建之法
    基于二元模型的拼音输入法
    融云单聊
    Gogs私有git仓库 + Drone构建CI/CD
    仿jq ajax封装支付宝小程序request.js
    Electron 和 Angular 构建桌面应用程序
    css多行溢出省略号
    package-lock和package.json
    控制窗体的小程序
  • 原文地址:https://www.cnblogs.com/wang1204/p/6401512.html
Copyright © 2011-2022 走看看