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


Use of closing database connection in php

我一直认为关闭数据库连接总是一种很好的做法,无论数据库/ORM如何,比如mysql_close()、Propel::close()等。

参考我的另一个问题和其他一些关于互联网的研究,我发现了一个令人惊讶的面孔,大多数人建议你关闭连接并不重要,因为连接总是在请求后关闭。

然而,我发现这些答案有点难以消化。原因是,为什么所有的DB lib、ORM都提供关闭方法?如果它在那里,在每个ORM/lib中,一定有一些好的用途。

有人能告诉我们在什么情况下,我们应该使用关闭方法来关闭数据库连接吗&如果这些方法根本没有用,为什么它们出现在所有db-libs/ORM中?

编辑

我的结论

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

  • 如果您的脚本预计持续时间不到100毫秒,请不要麻烦关闭连接
  • 但是:如果脚本预计会持续更长时间,并且从最后一次DB操作到脚本关闭之间还有一段时间,则通过调用*close()为其他脚本释放连接

我真的很难接受一个答案,因为两个答案都是正确的。只是接受所有评论的答案,使其保持在首位。但两个正确答案均为+1。

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

释放资源

得益于PHP 4的Zend引擎引入的引用计数系统,一个不再引用的资源会被自动检测到,并由垃圾收集器释放。因此,很少需要手动释放内存。

希望这对你有更多帮助。

(来源)

编辑:

mysql_close()的目的也是为了节省计算机资源,但使用它的另一个关键原因是MySQL服务器可以接受的连接数量有限,如果你有几个客户端无故打开连接,那么服务器可能需要关闭其他等待的客户端。当然,这是一件坏事,因此,与mysql_free_result()一样,如果您认为从上次使用数据库到脚本结束还有一段时间,那么调用mysql_close()是件好事。

当您不再需要数据库连接时,关闭它总是一种很好的做法。即使它在脚本结束后自动关闭,也可能需要一秒钟或几秒钟后。如果你不再需要它,一个用户点击一个页面并浪费半秒钟的数据库连接不会有什么不同——但20个用户一次这样做会突然变成10秒的开放连接——而确实会有不同。

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

在某种程度上,这与将变量设置为NULL或取消设置没有什么不同。您不需要来完成这项工作,但干净优雅的代码和资源管理始终是一件好事。

数据库连接不是无限的。尤其是商业数据库软件,其许可证通常将同时连接的数量限制在相对较小的数量。在这种情况下,当脚本不再使用时,您肯定希望关闭连接。虽然PHP在脚本终止时会自动关闭数据库连接,但在访问者下载完页面后才会关闭。如果他的连接很慢(拨号或移动),你所知道的可能需要十几二十秒。

开发良好的ORM,如Doctrine和Propel,擅长关闭MySQL连接。但是,如果您使用的是直php,我已经看到许多数据库问题可以追溯到未关闭的连接。明智的做法是在每个脚本结束时关闭所有数据库连接。