从mysql_connect()获取PHP PDO连接?

时间:2010-02-23 05:55:16

标签: php mysql pdo

我有一个调用mysql_connect()的遗留PHP / MySQL应用程序。大量现有下游代码使用此连接直接或通过包装器进行mysql_query()调用。

对于我在应用上开发的新代码,我想开始使用PDO。

如果我使用相同的主机/用户/传递/ dbname凭据进行PDO连接,我可能会非常幸运,在幕后,PHP会重新使用原始连接吗?或者PHP会创建两个与服务器不同的连接(不合需要,虽然完全可以理解)?

谢谢!

2 个答案:

答案 0 :(得分:8)

两个扩展在内部使用EG(persistent_list)来存储持久连接句柄。但是他们为这个列表创建了不同的哈希/键,因此他们无法找到相应其他扩展名的条目。

当pdo构建"mysql_<host&port>_<user>..."时,mysql扩展会创建"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之间不会共享和重用连接。

答案 1 :(得分: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秒后消失)