没有持久连接更好地关闭Pdo连接? &安培; Pdo连接性能

时间:2014-11-12 14:04:43

标签: php

我比mysql_query更习惯于Pdo命令,但我会在新项目中使用它们。

我想知道如果没有持久连接,最好关闭连接,或者如果它不会产生问题而离开它(就像在mysql_query上一样)。

第二个问题是: 完整的Pdo连接器

之间的性能存在差异
 $dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);

和沉没的人?

 $dbh = new PDO('mysql:host=localhost', $user, $pass);

我需要一个Web应用程序使用多个db,我选择在每个查询上放置dbname.dbtable,而不是在不同的db上打开两个或多个连接。

最终还有其他方法吗?

3 个答案:

答案 0 :(得分:4)

  1. 连接将在脚本结束时自动关闭(或者$dbh未设置或超出范围时)。这与ext / mysql和几乎所有其他数据库连接器的相同。您可以在知道自己完成连接后手动关闭连接,以释放可能占用的最少资源,但在实践中,它通常不值得。
  2. 唯一dbname的作用是告诉数据库服务器您要使用哪个数据库。唯一的区别在于,每次引用表格时都不需要使用db.table.column格式,只需使用table.column即可了解您正在谈论的数据库。没有值得一提的性能差异。

答案 1 :(得分:2)

如果您以后必须执行selectdb() - 类型的调用,那么无db的版本实际上效率较低。这必须作为单独的查询发送,这比在原始呼叫中发送它的开销要高得多。

请注意,您无需设置默认数据库。您可以简单地将所有查询写为绝对

SELECT fieldname FROM dbname.tablename ...

另请注意,除非您创建持久连接,否则当脚本退出并且清理操作启动时,PHP将自动销毁数据库连接。除非您为数据库使用持久连接,否则几乎不可能保留脚本退出时连接打开。

持久的联系在理论上可能听起来不错,但它们却彻底解决了问题。例如你开始一个事务,做一堆东西,然后脚本由于某种原因死亡。由于它是通过持久性事务完成的,因此与数据库的连接保持打开状态,事务处于运行状态,然后一些其他的php脚本启动并从池中分配该过时的连接。

现在你遇到了问题。原始脚本的事务仍处于活动状态,并处于某种不确定的中间状态。新脚本不知道它正在获得这个垃圾填充连接,并且只会开始自己的操作。您可以很容易地结束死锁,提交错误的数据等等......因此。

通常,应避免使用MySQL中的持久连接。它的连接协议实际上非常轻,并且开销很小。使用持久conn池节省的时间远远超过了从以前失败的脚本获取陈旧/垃圾连接的连接的危险。

答案 2 :(得分:1)

来自docs -

  

成功连接到数据库后,PDO类的实例将返回到您的脚本。该连接在该PDO对象的生命周期内保持活动状态。要关闭连接,您需要通过确保删除对它的所有剩余引用来销毁对象 - 您可以通过为保存对象的变量赋值来执行此操作。如果您没有明确地执行此操作,PHP将在脚本结束时自动关闭连接。

因此,当脚本结束时它将关闭,但我发现在每次查询后关闭PDO连接始终是一种好习惯。