我有以下类方法 -
class Someclass
{
/* Other properties and methods */
public function close_connection($connection=NULL)
{
return mysql_close($connection)
}
}
现在,在调用上面代码中的mysql_close
函数之前,我想检查$connection
是否指向打开的数据库连接。也就是说,我想确保我关闭的连接是打开的,但尚未关闭。
我该怎么做?
答案 0 :(得分:21)
您可以尝试检查您的$connection
变量是否真的是有效资源。
<?php
if(is_resource($connection))
{
mysql_close($connection);
}
?>
修改:好的,此更新后的代码现在包含Gordon的建议。
<?php
if(is_resource($connection) && get_resource_type($connection) === 'mysql link')
{
return mysql_close($connection);
}
else
{
return false;
}
?>
答案 1 :(得分:11)
您可以尝试mysql_thread_id($ connection)。如果没有可用的连接,那将返回false。
答案 2 :(得分:4)
如果您有其他代码可以关闭连接,请让他们将连接设置为null,以便您可以测试它。
如果由于超时或网络错误而无法确定连接是否已从另一端关闭,则测试它的唯一方法是使用mysql_ping等实际发送数据。但是,如果您只是想避免关闭可能已经关闭的连接,那么这将浪费大量资源。
注意:如evord所述,如果连接不再打开,使用mysql_ping将尝试重新打开连接。
答案 3 :(得分:1)
我会为此目的使用MYSQLI扩展,因为此扩展会自动处理所有连接,您根本不需要担心,但它根本就没有。这个扩展名在每个托管中=)对我而言,这是4年的默认值=)
另一种方式可能是最好处理异常,例如,如果不想使用@mysql_close()然后只是捕获异常并且什么都不做=)返回true ...
答案 4 :(得分:1)
我找到了一个很好的解决方案,将Travis和user353297(以及Gordon的)答案与我自己的一点点添加:
旧答案(不正确):
if(is_resource($connection) && get_resource_type($connection) === 'mysql link')
{
if($mysqli_connection_thread = mysqli_thread_id($connection))
{
$connection->kill($mysqli_connection_thread);
}
$connection->close();
}
编辑:我发现我之前汇总和使用的解决方案实际上并没有正常运行。这是因为我使用mysqli而不是mysql。我编辑的答案提供了以前代码的工作版本,但与mysqli连接对象(实际上不是资源)一起工作。
我在这里找到了解决方案:check if a variable is of type mysqli object?
新答案(并且适用于mysqli):
if(is_object($mysqli_connection) && get_class($mysqli_connection) == 'mysqli')
{
if($mysqli_connection_thread = mysqli_thread_id($connection))
{
$mysqli_connection->kill($mysqli_connection_thread);
}
$mysqli_connection->close();
}
我创建了一个函数,其中包含一些特定于某些数据库连接的语句,一旦我确定不再使用任何连接,我会在每个脚本的末尾调用该函数。这可以确保线程死亡,连接关闭 - 如果它是打开的 - 并且资源被释放,如果每个用户有多个连接到多个DB,这可能会成为一个问题,就像我的情况一样。
非常感谢特拉维斯,用户353297和戈登给我提供我需要的信息!
答案 5 :(得分:0)
只需使用@mysql_close($connection)
来抑制错误/警告。