>  기사  >  백엔드 개발  >  PHP에서 PDO를 통해 연결이 가능한지 확인하는 방법

PHP에서 PDO를 통해 연결이 가능한지 확인하는 방법

jacklove
jacklove원래의
2018-06-20 17:48:492556검색

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(), &#39;MySQL server has gone away&#39;)!==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. 테스트 데이터 삽입


db.php

insert into user(name) values(&#39;fdipzone&#39;),(&#39;xfdipzone&#39;),(&#39;terry&#39;);mysql> select * from user;
+----+-----------+| id | name      |
+----+-----------+|  1 | fdipzone  |
|  2 | xfdipzone ||  3 | terry     |
+----+-----------+
.

test.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[&#39;host&#39;];        $dbname = $config[&#39;dbname&#39;];        $dbuser = $config[&#39;user&#39;];        $dbpasswd = $config[&#39;password&#39;];        $pconnect = $config[&#39;pconnect&#39;];        $charset = $config[&#39;charset&#39;];        $dsn = "mysql:host=$dbhost;dbname=$dbname;";        try {            $h_param = array(
                    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
            );            if ($charset != &#39;&#39;) {                $h_param[PDO::MYSQL_ATTR_INIT_COMMAND] = &#39;SET NAMES &#39; . $charset; //設置默認編碼
            }            if ($pconnect) {                $h_param[PDO::ATTR_PERSISTENT] = true;
            }            $conn = new PDO($dsn, $dbuser, $dbpasswd, $h_param);

        } catch (PDOException $e) {            throw new ErrorException(&#39;Unable to connect to db server. Error:&#39; . $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;
    }

}?>
4.

php cli 모드에서 test.php를 실행한 후 즉시 mysql.server stop 및 mysql.server start를 실행하여 플래시 중단을 시뮬레이션합니다.

<?phprequire &#39;db.php&#39;;// 数据库设定$config = array(    &#39;host&#39; => &#39;localhost&#39;,    &#39;dbname&#39; => &#39;user&#39;,    &#39;user&#39; => &#39;root&#39;,    &#39;password&#39; => &#39;&#39;,    &#39;pconnect&#39; => 0,    &#39;charset&#39; => &#39;&#39;);// 循环执行while(true){    // 创建数据连接
    $dbconn = DB::get_conn($config);    // 判断连接是否有效
    $status = pdo_ping($dbconn);    if($status){        echo &#39;connect ok&#39;.PHP_EOL;
    }else{        echo &#39;connect failure&#39;.PHP_EOL;        // 重置连接
        DB::reset_connect();        $dbconn = DB::get_conn($config);
    }    // 执行查询
    $sqlstr = &#39;select * from user where id=?&#39;;    $condparam = array(mt_rand(1,3));    $data = DB::query($dbconn, $sqlstr, $condparam);
    print_r($data);    // 延时10秒
    echo &#39;sleep 10&#39;.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(), &#39;MySQL server has gone away&#39;)!==false){            return false;
        }
    }    return true;
}?>

실행 출력:

mysql.server stopShutting down MySQL
.... SUCCESS! 
mysql.server start
Starting MySQL
 SUCCESS!

중단이 발생한 후 pdo_ping()이 false를 반환하고 연결이 실패한 다음 자동 재연결을 호출하여 후속 쿼리가 계속 실행될 수 있도록 하는 것을 볼 수 있습니다.

이 글에서는 PHP에서 PDO를 통해 연결이 가능한지 확인하는 방법에 대해 설명합니다. 자세한 내용은 PHP 중국어 웹사이트를 참고하세요.

관련 권장사항:

PHP를 사용하여 페이지 또는 이미지가 gzip으로 압축되었는지 확인


현재 지리적 위치를 가져와 Baidu 지도에 표시하는 HTML5 예


자동으로 생성됨 PHP 고유 번호 클래스의 증가된 ID

위 내용은 PHP에서 PDO를 통해 연결이 가능한지 확인하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.