【问题标题】:Use of closing database connection in phpphp中关闭数据库连接的使用
【发布时间】:2012-09-11 09:21:09
【问题描述】:

我一直认为关闭数据库连接总是一个好习惯,无论数据库/ORM如何,例如mysql_close()、Propel::close()等。

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

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

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

编辑

我的结论

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

  • 如果您的脚本预计持续时间少于 100 毫秒,请不要费心关闭连接。
  • 但是:如果脚本预计会持续更长时间,并且在最后一次 DB 操作和脚本关闭之间有一段时间,请通过调用 *close() 为其他人释放连接。

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

【问题讨论】:

    标签: php symfony1 doctrine database-connection propel


    【解决方案1】:

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

    释放资源

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

    希望这对您有更多帮助。

    (source)

    编辑:

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

    【讨论】:

    • 如果它引用了——但是条件(例如尚未确定的 if 语句)导致它永远不会被使用怎么办?如果该检查距离执行时间还有半秒怎么办?还是五秒后?不是说你错了,但最好是充分利用提供给你的所有工具。
    • 从第一个 (+16) 答案开始:如果您的脚本在获取结果后需要执行大量处理并检索到完整的结果集,那么您绝对应该关闭连接。如果你不这样做,当 Web 服务器被大量使用时,MySQL 服务器有可能会达到它的连接限制。正是我要说的,伙计。
    • 您要关闭数据库还是取消分配用于存储查询结果的内存? tuxradar.com/practicalphp/9/4/3
    • OP 在询问连接,我只是使用了根据需要取消设置变量的类比。
    【解决方案2】:

    当您不再需要数据库连接时,最好关闭它。即使它在脚本结束后自动关闭 - 也可能是另一秒钟或几秒钟后。如果您不再需要它,一个用户点击一个页面并浪费数据库连接半秒不会有任何影响 - 但是一次执行 20 个操作会突然打开连接 10 秒 - 确实 em> 有所作为。

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

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

    【讨论】:

    • 嗯,我从来没有考虑过 PHP/Zend 内部是如何发生的,但我想现在我的项目也需要它。有人可以阐明(两个连接关闭操作;手动和通过zend)和(让连接打开几毫秒/秒)之间更昂贵的东西。我猜,但不确定,它是关于 CPU(1 个额外的关闭操作)与 RAM(一个额外的打开连接对象)?
    • @KapilSharma 除了我正在编写的一些代码中的一些非常明显的情况外,我没有运行测试,但与此同时,每个特定服务器及其拥有的资源可能会有所不同。您可以使用 microtime 运行一些测试以查看需要多长时间,但通常,如果您不再调用 mysql,请关闭它。如果您的代码在语句之间运行需要一段时间,可能是一个关闭的机会 - 但最好检查一下。
    【解决方案3】:

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

    【讨论】:

    • 谢谢,这对我来说是新的一点,脚本完成被认为是所有内容的下载。
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-07
      • 1970-01-01
      • 2015-06-27
      • 2016-01-18
      • 1970-01-01
      • 2011-10-19
      相关资源
      最近更新 更多