当数据库连接丢失时,如何在PHP中重新连接并重试MySQL查询?



我有一个PHP文件,它有时会执行很长时间,MySQL连接(mysqli对象)会过时。 如果我检查与mysqli_ping的连接(如果mysqli_ping返回false,则重新连接),那么我永远不会遇到问题。 但是,在每个查询之前执行 ping 似乎效率非常低,因此我只想在查询失败时执行 ping 检查(并重新连接)。 我的问题是,我似乎无法让我的代码在mysqli_query失败时引发异常以触发重新连接。

这是我的"基本"代码:

<?php
function query($query) {
$connection = $GLOBALS['global_connection'];
if(empty($connection) || mysqli_connect_errno()) $connection = connect();
try {
$result = mysqli_query($connection, $query);
} catch(Exception $e) {
if(!mysqli_ping($connection)) {
$connection = connect(); // reestablish the connection
$GLOBALS['global_connection'] = $connection; // update global connection value
$result = mysqli_query($connection, $query); // requery using the new connection
}
}
return $result;
}

问题是mysqli_query中的错误连接不会导致引发异常,但它确实会导致错误出现在我的错误日志中。

我在mysqli_query之前尝试过mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);(如其他问题中所建议的那样),但这并没有改变结果。 我的 PHP 配置中也启用了mysqli.reconnect,但这似乎并不能阻止这一点。

所以我的问题是:

mysqli_query失败(由于连接超时)时如何引发异常?

如何以有效的方式自动重新连接数据库?

Per Barmar在评论中的帮助,我意识到我所要做的就是:

<?php
$result = mysqli_query($connection, $query);
if(empty($result)) {
if(!mysqli_ping($connection)) {
$connection = connect(); // re-establish the connection 
$GLOBALS['global_connection'] = $connection; // update global connection value
$result = mysqli_query($connection, $query); // re-query using the new connection
}
}

根本不需要try{}catch! 干净简单。

您需要管理(抛出)自己的自定义异常,以便按照您需要的方式工作。我会考虑创建一个数据库抽象类来帮助解决这个问题。数据库类将具有一个作为连接引用的成员变量,并且可以使用内置的错误处理中的 mysqli 来引发与 mysqli 连接对象的该实例相关的自定义异常。

如果您只需要一个数据库连接,我可能会尝试单例模式。

最新更新