【问题标题】:Getting a PHP PDO connection from a mysql_connect()?从 mysql_connect() 获取 PHP PDO 连接?
【发布时间】:2015-09-08 23:41:52
【问题描述】:

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

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

如果我使用相同的主机/用户/密码/dbname 凭据进行 PDO 连接,我会不会很幸运以至于 PHP 会重新使用原始连接?或者 PHP 会创建两个到服务器的不同连接(不受欢迎,尽管完全可以理解)?

谢谢!

【问题讨论】:

  • @Pascal, @VolkerK:感谢您的出色回答,尽管我不想听到这个消息...... ;-( 当然希望我能同时接受它们。再次感谢!跨度>

标签: php mysql pdo


【解决方案1】:

如果您使用两个不同的 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秒后消失)

【讨论】:

    【解决方案2】:

    两个扩展在内部都使用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 调用的事务...遗留代码问题...
    • 据我所知,如果不修改 pdo/mysql 模块的代码,这是不可能的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-26
    • 1970-01-01
    • 2012-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多