Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP:如何确定数据库连接是否打开_Php_Mysql - Fatal编程技术网

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

PHP:如何确定数据库连接是否打开,php,mysql,Php,Mysql,我有以下的课堂方法- class Someclass { /* Other properties and methods */ public function close_connection($connection=NULL) { return mysql_close($connection) } } 现在,在调用上述代码中的mysql\u close函数之前,我想检查$connection是否指向打开的数据库连接。也就是说,我希望确保我正在

我有以下的课堂方法-

class Someclass
{
    /* Other properties and methods */

    public function close_connection($connection=NULL)
    {
        return mysql_close($connection)
    }
}
现在,在调用上述代码中的
mysql\u close
函数之前,我想检查
$connection
是否指向打开的数据库连接。也就是说,我希望确保我正在关闭的连接是打开的,并且尚未关闭


我该怎么做呢?

只需使用
@mysql\u close($connection)
来抑制错误/警告。

如果您有其他可能关闭连接的代码,请让他们将连接设置为null,以便您可以进行测试

如果您不确定是否由于超时或网络错误而从另一端关闭了连接,那么测试它的唯一方法就是使用mysql\u ping之类的工具实际发送数据。然而,如果您只是试图避免关闭一个可能已经关闭的连接,那么这将是一种严重的资源浪费


注意:如evord所述,如果连接不再打开,则使用mysql\u ping将尝试重新打开连接。

您可以尝试使用mysql\u thread\u id($connection)。如果没有可用的连接,则返回false。

我将使用MYSQLI扩展实现此目的,因为此扩展自动处理所有连接,您不必担心,但完全可以。这个扩展是在每一个主机=)对我来说,这是一个默认的4年了=)


另一种方法可能是处理异常的最佳方法,例如,如果不想使用@mysql\u close(),则只需捕获异常并不执行任何操作=)返回true…

您可以尝试检查
$connection
变量是否为有效资源

<?php
if(is_resource($connection))
{
    mysql_close($connection);
}
?>


编辑:好的,这个更新的代码现在包含了的建议

<?php
if(is_resource($connection) && get_resource_type($connection) === 'mysql link')
{
    return mysql_close($connection);
}
else
{
    return false;
}
?>

我发现一个很好的解决方案是将Travis和user353297(以及Gordon)的答案与我自己的答案结合起来:

旧答案(不正确):

编辑:我发现我以前聚合和使用的解决方案实际上工作不正常。这是因为我使用的是mysqli而不是mysql。我编辑的答案提供了前一段代码的工作版本,但可以使用mysqli连接对象(实际上它不是资源)

我在这里找到了解决方案:

新的答案(并能为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的连接,这可能会成为一个问题,就像我的情况一样


非常感谢Travis、user353297和Gordon为我提供了整合这些内容所需的信息

戈登:我在一家大公司工作,在那里“必须”关闭生产中的所有错误。所以这种把戏没问题。@holms:我不同意,做一个检查以防止错误,而不是仅仅隐藏它。无论如何,您可以使用
error\u reporting
在PHP中隐藏错误,而不是在所有函数前加上@…@nico:处理错误最人性化的方法是异常。虽然在php中使用人性化的方式是有问题的,但当你不得不维护一个耗资2万美元的大便系统时。。这是php的现实。@holms我同意关闭生产中的错误。但正如@nico所说,这是更好的全球控制和指令。顺便说一句,糟糕的软件在每种语言中都是现实。这个函数的工作量基本上与mysql_-ping相同。但是,ping函数实际上是专门为此目的编写的。我认为mysql\u ping尝试重新打开连接。mysqli\u thread\u id():无法获取mysqliNote,该函数将返回
TRUE
,即使
$connection
不是一个连接。您可以使用来确保。这应该是可接受的答案…在新答案中,如果之前连接已关闭,它将抛出:
mysqli\u线程\u id():无法获取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();
}