我应该检查 MySQL 与 is_resource 或 mysqli_ping 的连接吗?

Should I check for a MySQL connection with is_resource or mysqli_ping?

我应该检查 MySQL 与 is_resourcemysqli_ping 的连接吗?为什么?

if (!mysql_ping($mysqli)) {
    $mysqli = new mysqli($db_host,
                         $db_username,
                         $db_password,
                         $db_name);
}

if (!is_resource($mysqli)) {
    $mysqli = new mysqli($db_host,
                         $db_username,
                         $db_password,
                         $db_name);
}

is_resource($mysqli) 未将 MySQLi 资源报告为有效资源类型。

MySQLi 使用对象作为存储容器,而不是资源;即使当 使用程序 API,因此输出是预期的。

这已经 reported as a bug 很久以前了,这不是错误,而是预期的行为,正如约翰内斯在评论中所述。

所以,我想,你毕竟必须使用 mysqli_ping

这两种方法有不同的用途,因此一般的 "this-or-that" 答案不适合我。更有可能的是"use both"。

继续之前的两个更正:
1)在你的脚本中 $mysqli = new mysqli(... 意味着如果有效, $mysqli 是一个对象,而不是资源。如果它是通过 $mysqli = mysqli_connect(... 创建的,也是如此,尽管它也可能是 null 以指示错误。使用 $mysqli instanceof MySQLi 来检查,而不是 is_resource()

2) 不要将 mysql_* 函数与 MySQLi api 混合使用。因此,它将是 mysqli_ping 而不是 mysql_ping.


a) 使用$mysqli instanceof MySQLI 检查脚本是否获得了mysqli 连接的实例,无论连接是否仍然可用。如果 $mysqli 不是 MySQLi 的实例,则脚本不能使用 mysqli_* 函数或 MySQLi::* 方法,包括 mysqli_ping。当使用 $mysqli=mysqli_connect() 而不是 $mysqli = new mysqli(...) 时 $mysqli 可能为 NULL。在这种情况下,instanceof 将 "return" false。如果 $mysqli 由于某种原因为 false 或字符串或数字或....除 MySQLi 实例以外的其他内容,则相同。

b) 如果你有一个MySQLi实例,你可以使用mysqli_ping($mysqli)$mysqli->ping()检查连接是否仍然可以使用或需要重新建立。 MySQLi 实例上的一些操作在没有有效连接的情况下也能正常工作,尽管您可能不感兴趣。