我应该检查与is_resource
或mysqli_ping
的MySQL连接吗?为什么?
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,因此输出是预期的。
正如约翰内斯在评论中所说,这很久以前就被报告为一个错误,它不是一个错误,而是预期的行为。
所以,我想,你毕竟必须使用mysqli_ping
。
这两种方法都有不同的目的,因此一般的"这个或那个"答案不会做imo。更有可能的是"两者兼而有之"。
在继续之前有两个更正:
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。在这种情况下,实例将"返回"false
。如果$mysqli由于某种原因为 false、字符串或数字或 ....除了MySQLi的实例之外的其他东西。
b) 如果你有 MySQLi 的实例,你可以使用 mysqli_ping($mysqli)
或 $mysqli->ping()
来检查连接是否仍然可以使用或需要重新建立。MySQLi 实例上的一些操作在没有有效连接的情况下可以工作,尽管您可能对这些操作不感兴趣。