如何使用PDO ping MySQL数据库并进行重新连接?

14

我正在使用MySQL PDO 来处理数据库查询。但大多数时候,MySQL连接会断开。因此,我正在寻找PDO将检查db连接是否存在,如果不存在,则需要连接数据库以继续查询执行。

我对MySQL PDO还不熟悉。我应该如何处理这种情况?


为什么不使用 mysqli_ping(),如果返回 false,则尝试重新连接。 - user1978142
6
mysqli_ping()函数在使用PDO时有何帮助? - user12345
2个回答

11

我尝试寻找解决相同问题的方法,并找到了以下答案:

class NPDO {
    private $pdo;
    private $params;

    public function __construct() {
        $this->params = func_get_args();
        $this->init();
    }

    public function __call($name, array $args) {
        return call_user_func_array(array($this->pdo, $name), $args);
    }

    // The ping() will try to reconnect once if connection lost.
    public function ping() {
        try {
            $this->pdo->query('SELECT 1');
        } catch (PDOException $e) {
            $this->init(); // Don't catch exception here, so that re-connect fail will throw exception
        }

        return true;
    }

    private function init() {
        $class = new ReflectionClass('PDO');
        $this->pdo = $class->newInstanceArgs($this->params);
    }
}

完整故事请参见在PDO中添加ping()函数
有人想使用PDO :: ATTR_CONNECTION_STATUS,但他发现:“$db->getAttribute(PDO::ATTR_CONNECTION_STATUS)即使在停止mysqld后仍然回复“通过UNIX套接字的本地主机”。”

1
显然,“DO 1;”比“SELECT 1”更短(在网络传输和响应时间方面)……我自己还没有尝试过,但只是想分享一种替代方法…… - RVN
我猜“DO 1”是这个过程的更好方法,除非该函数需要验证服务器是否真正回答(但我们在太高级的API上)。 - John
1
如果您使用的是PHP 5.6+,最好使用解包参数而不是使用反射,如此处所述:http://php.net/manual/en/migration56.new-features.php#migration56.new-features.splat$this->pdo = new \PDO(...$this->params); - bradynpoulsen

-3
你可以像这样使用:
# connect to the database
try {
  $DBH = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass);
  $DBH->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );

}
catch(PDOException $e) {
    echo "Connection error " . $e->getMessage() . "\n";
    exit;
}

2
问题是如何进行ping和重新连接,而不是如何捕获连接错误! - transilvlad
mysql_ping被弃用是有原因的。这不再是正确的方法。这才是正确的方法。虽然他应该详细说明。 - steve
mysql_ping用于检查连接在脚本执行过程中的状态,而不仅仅是在建立连接后进行检查,这样可以充分发挥其作用。 - José Carlos PHP

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接