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

7
我一直以为无论是哪种数据库/ORM,都应该关闭数据库连接,如mysql_close(),Propel::close()等。
参考我的另一个问题以及在互联网上的一些研究,我发现一个惊人的事实,大多数人建议如果连接总是在请求后关闭,那么关闭连接并不重要。
然而,我发现这些答案有点难以理解。原因是,为什么所有DB库、ORM都提供关闭方法?如果存在,在每个ORM/库中,肯定有某些好的用途。
请问有人能够说明在什么情况下,我们应该使用关闭方法来关闭DB连接?& 如果这些方法根本没有用处,为什么它们存在于所有的db库/ORM中? 编辑 我的结论 Bondye和Fluffeh之间进行了良好的讨论,解决了我对连接关闭的疑虑。感谢他们两个。
  • 如果您的脚本预计持续时间少于100毫秒,请不要费心关闭连接。
  • 但是:如果脚本预计持续时间较长,并且在最后一次数据库操作和脚本关闭之间有一些时间,请通过调用*close()为其他人释放连接。

对我来说,很难接受一个答案作为正确答案,因为两个答案都是正确的。只接受带有所有评论的答案,以便它保持在顶部。但是+1给两个正确答案。

4个回答

7

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

释放资源

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

希望这可以帮助您更好地理解。

(来源)

编辑:

mysql_close()函数的目的之一是节省电脑资源,但另一个重要原因是MySQL服务器只能接受有限数量的连接,如果您有多个客户端保持连接处于打开状态而没有实际意义,则服务器可能需要拒绝其他等待的客户端。当然,这是不好的,所以像mysql_free_result()一样,在最后一次使用数据库和脚本结束之间有一些时间时调用mysql_close()是个好习惯。


1
如果它被引用了,但是条件(例如尚未确定的if语句)导致它永远不会被使用怎么办?如果检查还需要半秒钟的执行时间呢?甚至需要五秒钟的时间?并不是说你错了,但是充分利用所有给予你的工具是很好的。 - Fluffeh
1
请关闭MySQL连接 - 重要的事情PHP MySQL - 断开与数据库的最佳时间是什么时候? - Ron van der Heijden
1
从第一个(+16)个答案中:如果您的脚本在获取结果后需要执行大量处理并检索完整的结果集,则绝对应该关闭连接。如果不这样做,当Web服务器处于重负荷状态时,MySQL服务器有可能达到其连接限制。 这正是我所说的伙计。 - Fluffeh
1
你想关闭数据库还是释放用于存储查询结果的内存?http://www.tuxradar.com/practicalphp/9/4/3 - Ron van der Heijden
1
OP 询问有关连接的问题,我只是用取消设置变量的类比来解释。 - Fluffeh

5

当你不再需要数据库连接时,关闭它是一个好习惯。即使在脚本结束后自动关闭它 - 也许还需要另外一秒或几分之一秒时间。如果你不再需要它,一个用户点击页面并浪费了数据库连接半秒钟不会有影响 - 但是如果同时有二十个用户这样做,那么就会有10秒的开放连接 - 而这确实会产生影响。

同时,重复使用连接可能是一个好习惯 - 创建和打开连接通常需要至少几毫秒的时间 - 如果你例如插入数十万行,每次都需要几毫秒时间,这将非常快地累加起来。

在某种程度上,它与将变量设置为NULL或取消设置没有什么不同。你不一定需要这样做,但清晰优雅的代码和资源管理总是件好事。


我从未深入思考过PHP/Zend内部的运作方式,但我想这对我的项目现在也是必要的。有人能否解释一下在(手动关闭连接和通过zend关闭连接)以及(让连接再开放几毫秒/秒)之间哪个更昂贵?我猜测,但不确定,这涉及到CPU(1个额外的关闭操作)与RAM(一个额外的开放连接对象)之间的关系。 - Kapil Sharma
1
@KapilSharma 我写代码时只运行了一些非常明显的测试用例,但同时每个特定的服务器和其可用资源都可能不同。您可以使用微秒运行一些测试以查看需要多长时间,但通常情况下,如果您不再调用mysql,请关闭它。如果代码在语句之间运行时间较长,则可能是关闭的机会-但最好进行检查。 - Fluffeh

4

数据库连接并不是无限的。特别是商业数据库软件,通常会有许可证限制同时连接的数量为一个相对较小的数字。在这种情况下,当您的脚本不再活跃使用时,您肯定希望关闭连接。虽然PHP在脚本终止时会自动关闭数据库连接,但它不会在访问者完成页面下载之前关闭连接。如果他的连接速度很慢(拨号或移动),那可能需要十秒钟、二十秒钟甚至更长的时间。


谢谢,这对我来说是一个新的观点,脚本完成被视为下载所有内容。 - Kapil Sharma

0

像Doctrine和Propel这样的成熟ORM在关闭MySQL连接方面表现良好。但是,如果您正在使用直接的php,则会发现许多数据库问题都可以追溯到未关闭的连接。在每个脚本结束时关闭所有db连接是明智的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接