我有一个调用mysql_connect()的遗留PHP/MySQL应用程序.大量现有的下游代码mysql_query()使用此连接直接或通过包装器进行调用.
对于我在应用程序上开发的新代码,我想开始使用PDO.
如果我使用相同的主机/用户/ pass/dbname凭据创建PDO连接,我可能会很幸运,在底层,PHP会重新使用原始连接吗?或者PHP会创建两个与服务器不同的连接(不受欢迎,尽管完全可以理解)?
谢谢!
两个扩展在内部使用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
}
}
Run Code Online (Sandbox Code Playgroud)
所以答案是:不,mysql扩展和PDO之间不会共享和重用连接.
如果您使用两个不同的API(即mysql_*PDO),PHP将生成两个不同的连接.
并且,作为"证明",请考虑以下代码:
$db = mysql_connect('localhost', 'USER', 'PASSWORD');
$pdo = new PDO('mysql://@localhost/astralblog', 'USER', 'PASSWORD');
sleep(5);
Run Code Online (Sandbox Code Playgroud)
在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)
Run Code Online (Sandbox Code Playgroud)
(有问题的连接是最后一个,当我启动PHP脚本时出现,并在5秒后消失)