PHP:如何确定数据库连接是否已打开

时间:2010-06-19 10:12:31

标签: php mysql

我有以下类方法 -

class Someclass
{
    /* Other properties and methods */

    public function close_connection($connection=NULL)
    {
        return mysql_close($connection)
    }
}

现在,在调用上面代码中的mysql_close函数之前,我想检查$connection是否指向打开的数据库连接。也就是说,我想确保我关闭的连接是打开的,但尚未关闭。

我该怎么做?

6 个答案:

答案 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)来抑制错误/警告。