在php中使用关闭数据库连接

时间:2012-09-11 09:21:09

标签: php symfony1 doctrine database-connection propel

我总是假设关闭数据库连接始终是一个好习惯,无论数据库/ ORM如何,如mysql_close(),Propel :: close()等。

参考我的其他question和其他一些关于互联网的研究,我开始知道一个令人惊讶的面孔,大多数人建议如果你关闭连接并不重要,因为连接总是在关闭之后关闭请求。

然而,我发现这些答案很难消化。原因是,为什么所有DB lib,ORM都提供close方法?如果它存在,在每个ORM / lib 中,必须有一些很好的使用它。

有人可以说明在什么情况下,我们应该用close方法关闭数据库连接? &安培;如果这些方法根本没用,为什么它们存在于所有db libs / ORM中?

修改

我的结论

这是Bondye和Fluffeh之间的一次很好的讨论,它清除了我对使用连接关闭的疑虑。感谢他们两人。

  • 如果您的脚本预计持续时间不到100毫秒,请不要打扰关闭连接。
  • 但是:如果脚本预计会持续更长时间并且在上次数据库操作和脚本关闭之间有一段时间,则通过调用* close()为其他人提供免费连接。

我真的很难接受一个答案,因为答案都是正确的。只需接受所有评论的回答,以便保持最佳状态。但是+1都是正确答案。

4 个答案:

答案 0 :(得分:7)

通常不需要使用mysql_close(),因为非持久性开放链接会在脚本执行结束时自动关闭。

释放资源

  

由于PHP 4的Zend引擎引入了引用计数系统,因此可以自动检测到没有更多引用的资源,并且它被垃圾收集器释放。因此,很少需要手动释放内存。

希望这对你有所帮助。

source

修改

mysql_close()的目的也是为了节省计算机资源,但使用它的另一个关键原因是MySQL服务器可以接受的连接数量有限,并且如果有多个客户端保持连接打开无缘无故,服务器可能需要拒绝其他等待的客户端。当然这是一件坏事,因此,与mysql_free_result()一样,如果您认为在上次使用数据库和脚本结束之间会有一段时间,最好调用mysql_close()

答案 1 :(得分:6)

当您不再需要数据库连接时,最好关闭它。即使它在脚本结束后自动关闭 - 可能是另一秒或一段时间后分秒。如果你不再需要它,一个用户点击一个页面并浪费数据库连接半秒也不会产生任何影响 - 但是二十个用户一次突然开启10秒连接 - 而确实有所作为。

同时,重新使用连接可能是一个很好的做法 - 制作和打开连接通常需要至少几毫秒 - 如果你要插入几十万行,那么每次几毫秒加起来非常快。

在某种程度上,将变量设置为NULL或取消设置也没有什么不同。你不来做,但干净优雅的代码和资源管理总是是一件好事。

答案 2 :(得分:4)

数据库连接不是无限制的。特别是商业数据库软件通常具有许可证,其将同时连接的数量限制为相对较小的数量。在这种情况下,您肯定希望在脚本不再使用时关闭连接。虽然PHP会在脚本终止时自动关闭数据库连接,但在访问者下载页面之前不会这样做。如果他的连接速度很慢(拨号或移动),那么你可能需要花费10秒,20秒。

答案 3 :(得分:0)

开发良好的ORM就像Doctrine和Propel一样擅长关闭MySQL连接。但是,如果你使用直接的PHP,我已经看到很多数据库问题被追溯到未关闭的连接。在每个脚本的末尾关闭所有数据库连接是明智的。