PHP:如何为已经打开的连接获取MySQL链接标识符?

时间:2009-08-26 07:52:35

标签: php mysql

当您使用mysql_connect()打开MySQL连接时,它会返回一个链接标识符。但是,如果您希望稍后在脚本中再次获取该链接标识符,该怎么办? (例如:一个插件,需要打开一个新的数据库连接,仍然可以访问旧的数据库连接。)

我正在寻找一种方法将链接标识符返回给mysql_connect()打开的最后一个连接。有没有这样做的功能?

6 个答案:

答案 0 :(得分:7)

尽管Anti Veeranna的解释是正确的, 是一种非常直接的方式来做你想做的事情。如果您要阅读mysql_connect()的文档,您会发现此函数有第4个参数“new_link”,默认情况下为 false 。如果再次使用相同的参数调用mysql_connect()(可能就是这种情况),则不会创建新连接,而是返回旧连接的资源标识符。

任何时候;)

答案 1 :(得分:2)

不,没有。您必须自己记录链接标识符。您可以将链接标识符定义为类属性,以便您可以从方法中轻松访问它,而不必担心将其作为变量一次又一次地传递。

答案 2 :(得分:1)

感谢大家的回复。

我最终打开了自己的连接,当我的插件完成后,最后一行重新打开初始连接,因此主脚本的其余部分可以使用它所期望的数据库。我知道,它很草率,但在这种情况下似乎没有更好的选择。 :/

更新::我已经在php.net上将此作为功能请求提交。链接是:http://bugs.php.net/bug.php?id=49400

答案 3 :(得分:0)

您必须将句柄存储在var。

$link = mysql_connect($host, $login, $pass);

在新的HTTP请求之前,您可以在脚本中重复使用$ link。

答案 4 :(得分:0)

您必须自己存储链接标识符,如其他答案所述,或者您可以简单地省略它,mysql_ *函数可以重用现有的句柄

mysql_query帮助解释如下:

resource mysql_query  ( string $query  [, resource $link_identifier  ] )

link_identifier

    The MySQL connection. If the link identifier is not specified, the last link opened by mysql_connect() is assumed.

我自己不会使用这种重用行为,除非您完全确定您的应用程序(或任何插件等)没有打开任何与其他数据库的新连接。

答案 5 :(得分:-1)

使用mysql_pconnect,即可做你想做的事。

  

首先,在连接时,该函数将首先尝试查找已使用相同主机,用户名和密码打开的(持久)链接。如果找到一个,将返回一个标识符,而不是打开一个新连接。

您还可以使用静态或单例类来处理连接池。

<?php
class dbConnectionPooler
{
    static var $connections = array();

    private static function createConnection($host, $username, $password, $db) {
        $connection = mysql_pconnect($host, $username, $password);

        if (FALSE !== $connection) {
            $result = mysql_select_db($db, $connection);

            if (FALSE !== $result) {
                self::$connections[self::getConnectionHash($host, $username, $password, $db)] = $connection;

                return $connection;
            }
        }
    }    

    private static function getConnectionHash($host, $username, $password, $db) {
        return md5($host. $username. $password. $db); // use your favourite hashing function here
    }

    public static function getConnection($host, $username, $password, $db) {
        $connectionHash = self::getConnectionHash($host, $username, $password, $db);

        if (array_key_exists($connectionHash, self::$connections)) {
            return self::$connections[$connectionHash];
        } else {
            return self::createConnection($host, $username, $password, $db);
        }

        return false;
    }
}

$connection = dbConnectionPooler::getConnection("dbhost", "dbuser", "dbpassword", "mydb");
?>