从mysql_connect()获取PHP PDO连接?

10
我有一个使用mysql_connect()调用的旧PHP/MySQL应用程序。大量现有的下游代码使用此连接通过直接或间接地包装器调用mysql_query()。
对于我在应用程序上开发的新代码,我想开始使用PDO。
如果我使用相同的主机/用户/密码/数据库名称凭据进行PDO连接,那么幸运的是,在幕后,PHP会重复使用原始连接吗?还是PHP将创建两个独立的连接到服务器(不理想,但完全可以理解)?
谢谢!

@Pascal,@VolkerK:非常感谢你们的出色回答,尽管这个消息不是我想听到的... ;-(真希望我能接受它们两个。再次感谢! - David Weinraub
2个回答

8
两个扩展内部都使用EG(persistent_list)存储持久连接句柄。但它们为此列表创建不同的哈希/键,因此它们无法找到相应其他扩展的条目。
mysql扩展创建的键的形式为"mysql_<host&port>_<user>...",而pdo则构建"PDO:DBH:DSN=<dsn>:<user>:...."。这些哈希值几乎像php脚本中的数组键一样使用。(过度)简化的例子:
function pconnect($host,$user,$pass) {
  global $persistent_list;
  $hashkey = sprintf("extensionname_%s_%s_%s", $host, $user, $pass);
  if ( isset($persistent_list[$hashkey]) ) {
    // use stored connection
  }
  else {
    // create new connection
  }
}

答案是:不会,mysql扩展和PDO之间的连接不会被共享或重复使用。

我必须问一下,有没有办法共享连接?因为我需要在使用并行的PDO和mysql_connect调用进行事务时使用它...这是遗留代码问题... - Sangoku
据我所知,如果不修改pdo/mysql模块的代码,这是不可能实现的。 - VolkerK

7

如果您使用两个不同的API(即mysql_*和PDO),PHP将生成两个不同的连接。


作为“证明”,请考虑以下代码片段:

$db = mysql_connect('localhost', 'USER', 'PASSWORD');
$pdo = new PDO('mysql://@localhost/astralblog', 'USER', 'PASSWORD');
sleep(5);

运行该命令将在MySQL服务器上创建两个不同的连接,这些连接将休眠5秒钟:
mysql> show processlist;
+----+------------+-----------------+------------+---------+------+-------+------------------+
| Id | User       | Host            | db         | Command | Time | State | Info             |
+----+------------+-----------------+------------+---------+------+-------+------------------+
| 41 | astralblog | localhost:46551 | astralblog | Sleep   |  188 |       | NULL             |
| 42 | astralblog | localhost:46552 | astralblog | Sleep   |  188 |       | NULL             |
| 43 | astralblog | localhost       | astralblog | Query   |    0 | NULL  | show processlist |
| 64 | astralblog | localhost       | NULL       | Sleep   |    4 |       | NULL             |
| 65 | astralblog | localhost       | NULL       | Sleep   |    4 |       | NULL             |
+----+------------+-----------------+------------+---------+------+-------+------------------+
5 rows in set (0,00 sec)

(所涉及的连接是在我启动PHP脚本后出现的最后两个连接,并在5秒后消失)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接