获取实际打开的db连接

时间:2012-02-16 15:56:57

标签: php mysql postgresql

如何在PHP中检查数据库连接是否已打开?

如何获得此连接的引用?

如何确定它是MySQL,Postgres还是别的什么?

4 个答案:

答案 0 :(得分:2)

您必须迭代每个已定义的变量并确定它是否是资源句柄。试试get_defined_vars()

答案 1 :(得分:2)

理想情况下,您会知道连接保存到的变量。没有它,找到它就变得很麻烦。这意味着你必须循环遍历每个变量并测试每个变量,但是出于任何原因这样做可能会很痛苦,因为它不会在当前范围之外找到变量。您可以使用以下方法循环当前变量:

foreach(get_defined_vars() as $x){
    // Code
}

要检查变量是否为有效连接,您可以使用以下代码,它应返回一个整数:

if(mysql_thread_id($connection){
    // Connection exists
}

一旦知道了它的连接,就可以使用以下命令返回连接类型,例如mysql。

echo get_resource_type($connection);

答案 2 :(得分:2)

问题的最佳解决方案可能是首先不要忘记数据库连接。

考虑将ORM集成到您的项目中,例如DoctrinePropel,或者如果您想要更轻量级的内容,请考虑使用Zend_Db之类的DBAL。所有这些解决方案都将类数据库连接封装在类实例中,以确保在必要时它们始终可用于您的代码。

答案 3 :(得分:1)

总的来说,我认为这不可能,至少在某种复杂的解决方法上是这样。例如,您可以循环遍历所有已定义的变量:

foreach(get_defined_vars() as $variable){
    if( is_resource($variable) && get_resource_type($variable)=='mysql link' ){
            // Found a connection!
        var_dump($variable);
    }
}

事实上,即使分配给当前范围之外的本地变量,连接仍然可用:

function foo(){
    $conn = mysql_connect('localhost', 'test', 'test');
}
foo();
$res = mysql_query('SELECT NOW() AS what_is_the_time');
if( $row = mysql_fetch_assoc($res) ){
    var_dump($row);
}

问题是PHP在谈论连接时并不真正关心变量:

// One connection and zero variables!
mysql_connect('localhost', 'test', 'test');
$res = mysql_query('SELECT NOW() AS what_is_the_time');
if( $row = mysql_fetch_assoc($res) ){
    var_dump($row);
}

您可以尝试查找有关当前连接的信息:

var_dump(mysql_thread_id());
// int(2696)

...虽然许多功能只会尝试建立一个新连接,如果没有,所以必须注意警告......:

  

警告:mysql_thread_id():用户''@ localhost'拒绝访问(使用密码:否)
  布尔(假)

...除非your configuration实际上允许成功的无凭据连接尝试。

我很确定,无论你想做什么,都可以完全不同的方式完成:)