PDOで接続が利用可能かどうかをphpで確認する方法

jacklove
リリース: 2023-04-01 15:22:01
オリジナル
2568 人が閲覧しました

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.

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     |
+----+-----------+
ログイン後にコピー

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[&#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;
    }

}?>
ログイン後にコピー

test。 php

<?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;
}?>
ログイン後にコピー

4.


test.php を php cli モードで実行し、すぐに mysql.server stop と mysql.server start を実行してシミュレートします。中断

mysql.server stopShutting down MySQL
.... SUCCESS! 
mysql.server start
Starting MySQL
 SUCCESS!
ログイン後にコピー

実行出力:

connect okArray(
    [0] => Array
        (
            [id] => 2
            [name] => xfdipzone
        )

)
sleep 10connect failureArray(
    [0] => Array
        (
            [id] => 3
            [name] => terry
        )

)
sleep 10connect okArray(
    [0] => Array
        (
            [id] => 3
            [name] => terry
        )

)
sleep 10
ログイン後にコピー
中断後、pdo_ping() が false を返し、接続が失敗し、後続のクエリが継続できるようにするために自動再接続を呼び出していることがわかります。処刑される。

この記事では、php で PDO を介して接続が利用可能かどうかを確認する方法について説明します。関連コンテンツの詳細については、php 中国語 Web サイトに注目してください。

関連する推奨事項:

php を使用して、ページまたは画像が gzip 圧縮されているかどうかを確認します

HTML5 は最新のファイルを取得します。地理的位置と Baidu Map に示されている例

php
の自動インクリメント ID を通じて一意の数値クラスを作成します。

以上がPDOで接続が利用可能かどうかをphpで確認する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート