So ermitteln Sie, ob die Verbindung über PDO in PHP verfügbar ist

jacklove
Freigeben: 2023-04-01 15:22:01
Original
2564 Leute haben es durchsucht

mysql_ping() prüft, ob die Verbindung zum Server normal ist. Gibt true zurück, wenn eine Verbindung zum Server verfügbar ist, andernfalls false.

Aber PDO unterstützt die Methode mysql_ping() nicht, daher müssen Sie Ihren eigenen Code schreiben, um die Methode mysql_ping() zu simulieren und zu überprüfen, ob die Verbindung verfügbar ist.

Der Code lautet wie folgt:

<?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;
}?>
Nach dem Login kopieren

Codedemonstration:

1. Erstellen Sie eine Testdatentabelle

CREATE TABLE `user` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(20) NOT NULL, PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Nach dem Login kopieren

2. Fügen Sie Testdaten ein

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     |
+----+-----------+
Nach dem Login kopieren

3. Demodatei

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

}?>
Nach dem Login kopieren

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;
}?>
Nach dem Login kopieren

4. Führen Sie

Test.php im PHP-CLI-Modus aus und führen Sie dann sofort mysql.server stop und mysql.server aus, um zu simulieren eine Unterbrechung

mysql.server stopShutting down MySQL
.... SUCCESS! 
mysql.server start
Starting MySQL
 SUCCESS!
Nach dem Login kopieren

Ausführungsausgabe:

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
Nach dem Login kopieren

Sie können sehen, dass pdo_ping() nach der Unterbrechung false zurückgibt, die Verbindung fehlschlägt und dann die automatische Wiederverbindung aufruft, um sicherzustellen, dass nachfolgende Abfragen fortgesetzt werden können ausgeführt werden.

In diesem Artikel wird erläutert, wie Sie feststellen können, ob die Verbindung über PDO in PHP verfügbar ist. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website.

Verwandte Empfehlungen:

Verwenden Sie PHP, um festzustellen, ob die Seite oder das Bild gzip-komprimiert wurde

HTML5 erhält den aktuellen Stand geografischer Standort und Das auf der Baidu-Karte gezeigte Beispiel

Erstellen Sie eine eindeutige Zahlenklasse durch die automatische Inkrementierungs-ID in PHP

Das obige ist der detaillierte Inhalt vonSo ermitteln Sie, ob die Verbindung über PDO in PHP verfügbar ist. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage