由于过多未关闭的mysql连接,我的客户托管服务提供商会阻止该网站。 该网站以前是由某人创建的,目前我正在维护它。
我在页面末尾添加了mysql_close
功能。它正在关闭连接良好,但我仍然得到一些未公开的连接。我可能会留下一些......
我需要的是使用cron文件或某些东西关闭服务器中未关闭的mysql连接。
我该怎么做?
是否可以立即关闭所有连接?如果是这样,怎么样?
答案 0 :(得分:6)
您使用持久连接吗?如果没有,那么你真的不应该担心关闭你的连接。来自manual
通常不会使用
mysql_close()
必要的,作为非持久的开放 链接自动关闭 脚本执行结束。看到 也释放资源。
你有太多的开放式连接,而不是太多的未闭合的连接,而不是(基本上是相同的)?例如,您网站上的用户数量太多了吗?
如果您确实有持久连接,请不要忘记:
mysql_close()不会关闭 创建的持久链接 mysql_pconnect()。
如评论中所述,在脚本结尾处不会释放mysql_connect()
资源。来自另一个manual page
的评论可能会有一个旁注释放资源
感谢引用计数 系统介绍了PHP 4的Zend 引擎,没有更多的资源 检测到它的引用 自动,它被释放 垃圾收集器。出于这个原因,它 很少有必要释放记忆 手动
注意:持久数据库链接是一个 这个规则的例外。他们不是 被垃圾收集器摧毁。 请参阅持久连接部分 了解更多信息。
至少使用PHP5.3.2和Windows 通过tcp连接,你应该永远 使用这个mysql_close()函数来 关闭并释放tcp套接字 由PHP使用。之后的垃圾收集 脚本执行没有关闭 tcp socket本身。插座 否则将保持“等待”状态 大约30秒,任何 额外的页面加载/连接 尝试只会增加总数 打开的tcp连接数。这个 等待时间似乎不是 可以通过PHP设置进行配置。
答案 1 :(得分:2)
mysql_connect将返回实际连接的标识符,您可以在mysql_close调用中使用该标识符。
$conn1 = mysql_connect(.....);
mysql_close($conn1);
如果页面本身打开多个连接,则需要使用标识符,因为否则mysql_close()只会关闭最后打开的连接。
但正如Nanne所说,PHP通常会在页面执行后自行清理连接,因此问题是如果不关闭它们,或者同时打开太多连接。通常,每个请求只需要一个连接,除非您同时打开并迭代多个结果集。
答案 2 :(得分:0)
如果您获得了一些未关闭的连接,很可能错过了某些页面,可能是通过包含等,或者调用“退出”的功能,因此您无法获得密码。
我不相信你可以使用cron从mysql启动其他连接。