【发布时间】:2009-08-26 07:52:35
【问题描述】:
当您使用 mysql_connect() 打开 MySQL 连接时,它会返回一个链接标识符。但是,如果您想稍后在脚本中再次获取该链接标识符怎么办? (例如:一个插件,需要打开一个新的数据库连接,仍然访问旧的。)
我正在寻找一种将链接标识符返回到 mysql_connect() 打开的最后一个连接的方法。有这样的功能吗?
【问题讨论】:
当您使用 mysql_connect() 打开 MySQL 连接时,它会返回一个链接标识符。但是,如果您想稍后在脚本中再次获取该链接标识符怎么办? (例如:一个插件,需要打开一个新的数据库连接,仍然访问旧的。)
我正在寻找一种将链接标识符返回到 mysql_connect() 打开的最后一个连接的方法。有这样的功能吗?
【问题讨论】:
即使 Anti Veeranna 的解释是正确的,也有 一种非常直接的方式来做你想做的事。如果您阅读mysql_connect() 的文档,您会发现该函数有第四个参数“new_link”,默认为 false。如果您使用相同的参数再次调用 mysql_connect()(可能就是这种情况),它不会创建新连接,而是会返回旧连接的资源标识符。
任何时候;)
【讨论】:
不,没有。您必须自己记录链接标识符。您可以将链接标识符定义为类属性,这样您就可以轻松地从您的方法中访问它,而不必担心一遍又一遍地将其作为变量传递。
【讨论】:
感谢大家的回复。
我最终打开了自己的连接,当我的插件完成后,最后一行重新打开了初始连接,因此主脚本的其余部分可以使用它期望的数据库。我知道这很草率,但在这种情况下似乎没有更好的选择。 :/
更新:: 我已在 php.net 上将此作为功能请求提交。链接为:http://bugs.php.net/bug.php?id=49400
【讨论】:
您必须将句柄存储在 var 中。
$link = mysql_connect($host, $login, $pass);
您可以在脚本中重复使用 $link,在新的 HTTP 请求之前。
【讨论】:
您要么必须自己存储链接标识符,如其他答案中所述,要么您可以简单地省略它,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.
我自己不会使用这种重用行为,除非您完全确定您的应用程序(或任何插件等)没有打开与其他数据库的任何新连接。
【讨论】:
使用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");
?>
【讨论】: