【问题标题】:How to close unclosed mysql connections?如何关闭未关闭的mysql连接?
【发布时间】:2011-06-12 07:38:26
【问题描述】:

由于未关闭的 mysql 连接过多,我的客户托管服务提供商阻止了该站点。 该网站以前是由某人创建的,目前我正在维护它。

我在页面末尾添加了mysql_close 函数。它关闭连接很好,但我仍然有一些连接未关闭。我可能会离开一些地方..

我需要的是使用 cron 文件或其他东西关闭服务器中未关闭的 mysql 连接..

我该怎么办?

是否可以一次关闭所有连接?如果有,怎么做?

【问题讨论】:

标签: php mysql


【解决方案1】:

您是否使用持久连接?如果不是,那么你真的不应该太担心关闭你的连接。来自manual

通常不使用mysql_close() 必要的,因为非持久打开 链接会自动关闭 脚本执行结束。看 也释放资源。

不是没有太多未关闭的连接,而是(当然本质上是相同的)您有太多打开的连接吗?例如,您网站上的用户过多?

如果您确实有持久连接,请不要忘记:

mysql_close() 不会关闭 由创建的持久链接 mysql_pconnect()。

正如评论中所说,mysql_connect() 资源在脚本末尾没有被释放是极不可能的。来自另一个manual page

释放资源

感谢引用计数 PHP 4 的 Zend 引入的系统 引擎,没有更多的资源 检测到对它的引用 自动地,它被释放 垃圾收集器。为此,它 很少需要释放内存 手动。

注意:持久数据库链接是一种 这条规则的例外。他们不是 被垃圾收集器销毁。 请参阅持久连接部分 了解更多信息。

不过,mysql_close page 上的 cmets 可能会有一个旁注

至少对于 PHP5.3.2 和 Windows 通过 tcp 连接,你应该总是 使用这个 mysql_close() 函数 关闭并释放 tcp 套接字 由 PHP 使用。垃圾收集后 脚本执行不会关闭 tcp 套接字本身。插座 否则将保持“等待”状态 大约 30 秒,并且任何 额外的页面加载/连接 尝试只会增加总数 打开的 tcp 连接数。这个 等待时间似乎不是 通过 PHP 设置进行配置。

【讨论】:

  • 连接似乎只用 mysql_connect() 打开..如何关闭打开的即使在 mysql_pconnect 让我们试试..
  • 但可以肯定的是:您不需要在文件末尾关闭每个连接:它将在那里自动关闭。如果你想中途这样做,你只需要关闭它,以释放资源。不要浪费精力将mysql_close 添加到所有脚本中:D。如果你不使用pconnect,你不必担心关闭那些课程
  • 不,它不会自行关闭 :(
  • 它们很可能不会关闭。非常均匀。如果页面停止运行,则连接将关闭。您的问题可能是页面没有停止运行,一次运行的页面太多,您正在使用 pconnect 等,但是您有一个带有mysql_connect() 的普通 php 脚本的机会,它不会关闭它的连接结局对我来说似乎为零。你会在 php 中发现一个未知的错误。
【解决方案2】:

mysql_connect 将返回实际连接的标识符,您可以在 mysql_close 调用中使用该标识符。

$conn1 = mysql_connect(.....);
mysql_close($conn1);

如果页面本身打开了多个连接,则需要使用标识符,否则 mysql_close() 只会关闭最后打开的连接。

但正如 Nanne 所说,PHP 通常会在页面执行后自行清理连接,所以问题是您是否不关闭它们,或者您是否同时打开了太多。通常每个请求只需要 1 个连接,除非您同时打开并遍历多个结果集。

【讨论】:

    【解决方案3】:

    如果你得到一些未关闭的连接,你可能会错过一些页面,可能是通过包含等,或者调用“退出”的函数,所以你不会访问你的关闭代码。

    我不相信你可以使用 cron 从 mysql 启动其他连接。

    【讨论】:

      猜你喜欢
      • 2014-12-18
      • 2013-10-16
      • 1970-01-01
      • 1970-01-01
      • 2016-04-04
      • 2014-08-17
      • 1970-01-01
      • 1970-01-01
      • 2021-04-14
      相关资源
      最近更新 更多