PHP mySQL-何时是与数据库断开连接的最佳时间?

PHP mySQL-何时是与数据库断开连接的最佳时间?,php,mysql,Php,Mysql,我使用惰性连接连接到我的DB对象中的DB。这基本上意味着它在第一个查询提交给它之前不会调用mysql_connect(),之后它会跳过重新连接 现在我在我的DB类中有一个名为disconnectFromDB()的方法,它几乎调用了mysql\u close()并设置$\u connected=FALSE(这样query()方法就会知道再次连接到DB)。是否应该在每次查询后(作为私有函数)或通过对象在外部调用此函数。。。因为我的想法是(代码只是一个示例) 现在,如果它在每次查询后都关闭,这会不会比

我使用惰性连接连接到我的DB对象中的DB。这基本上意味着它在第一个查询提交给它之前不会调用mysql_connect(),之后它会跳过重新连接

现在我在我的DB类中有一个名为
disconnectFromDB()
的方法,它几乎调用了
mysql\u close()
并设置
$\u connected=FALSE
(这样
query()
方法就会知道再次连接到DB)。是否应该在每次查询后(作为私有函数)或通过对象在外部调用此函数。。。因为我的想法是(代码只是一个示例)

现在,如果它在每次查询后都关闭,这会不会比我只在末尾添加这一行慢很多

$db->disconnectFromDB();
或者我应该把这一行写在这一页的末尾吗

两者都有哪些优点/缺点?在你的情况下,什么最有效?除了性能上的一点损失之外,忘记关闭mySQL连接真的有什么问题吗

感谢您花时间回答


谢谢大家!

据我所知,除非您使用持久连接,否则您的MySQL连接将在页面执行结束时关闭

因此,调用disconnect不会添加任何内容,并且因为您执行了延迟连接,如果您或其他开发人员出错并在错误的时间断开连接,则可能会导致创建第二个连接


有鉴于此,我只允许我的连接自动关闭。您的页面应该执行得很快,因此保持连接一小段时间不会造成任何问题。

您可能需要看看使用持久连接的方法。这里有两个链接可以帮助您


我刚刚在PHP网站上读到这篇关于持久连接的评论,我想知道:

下面是一些重要原因的概述 不使用持久连接:

  • 锁定表时,通常在连接关闭时将其解锁 关闭,但由于持续 连接不关闭,任何表 你不小心把威尔锁上了 保持锁定,这是唯一的方法 解锁它们是为了等待 连接超时或终止 过程同样的锁定问题 与事务一起发生。(见 以下是2002年4月23日的评论& (2003年7月12日)

  • 通常,连接关闭时会删除临时表, 但是由于持久连接 不接近,临时表不是这样 暂时的。如果你不明确 当您需要时,请删除临时表 完成后,该表将已经存在 对于新客户端,重复使用相同的 连接。同样的问题也会出现 设置会话变量。(见 以下是2004年11月19日的评论& 2007-8-2006)

  • 如果PHP和MySQL位于同一服务器或本地网络上,则 连接时间可以忽略不计,以 在这种情况下,对你没有好处 持久连接

  • Apache不能很好地处理持久连接。当它 接收来自新客户端的请求, 而不是使用一个可用的 已经有孩子了 持久连接打开,它倾向于 要产生一个新的孩子,必须 打开一个新的数据库连接。这 导致过多的进程,而这些进程只是 睡觉、浪费资源和 在到达目标位置时导致错误 最大连接数,加上失败 持久连接的任何好处。 (见以下2004年2月3日的评论), 脚注在 )


(上面的文字不是我写的)

不要麻烦断开连接。在每次查询之前检查
$\u connected
的成本与实际调用
$db->disconnectFromDB()的成本相结合关闭将比在完成每个页面时让PHP关闭连接花费更高

推理:

1:如果在脚本结束前保持连接打开:

  • PHP引擎通过mysql连接的内部数组循环
  • PHP引擎为每个连接在内部调用mysql_close()
2:如果您自己关闭连接:

  • 您必须为每个查询检查
    $\u connected
    的值。这意味着PHP必须检查变量
    $\u connected
    A)是否存在B)是否为布尔值,C)是否为真/假
  • 您必须调用“disconnect”函数,而函数调用是PHP中成本较高的操作之一。PHP必须检查函数A)是否存在,B)是否为私有/受保护,C)是否为函数提供了足够的参数。它还必须在新的局部作用域中创建$connection变量的副本
  • 然后,您的“disconnect”函数将调用mysql\u close(),这意味着PHP A)检查mysql\u close()是否存在,B)您是否为mysql\u close()提供了所有需要的参数,C)它们是否是正确的类型(mysql资源)

我在这里可能不是100%正确,但我相信可能性对我有利。

基本的执行单元大概是整个脚本。首先,您希望高效地将资源(即数据库)应用于单个脚本的整体

然而,PHP、Apache/IIS/任何东西都有自己的生命;他们能够使用您在脚本生命周期之外打开的连接。这就是持久(或池)连接的重要性

回到你的剧本。事实证明,您有很多机会在执行过程中创造性地使用该连接

典型的朴素脚本会一次又一次地点击连接,拾取与给定对象/模块/所选选项相关的本地适当的数据片段。这就是程序的所在
$db->disconnectFromDB();