我使用延迟连接来连接我的DB对象中的数据库.这基本上意味着它不会调用mysql_connect(),直到第一个查询被传递给它,然后它随后跳过重新连接.
现在我在我的DB类中有一个方法,disconnectFromDB()
它调用了几乎所有的调用mysql_close()
和设置$_connected = FALSE
(因此该query()
方法将知道再次连接到DB).应该在每次查询之后(作为私有函数)还是在外部通过对象调用...因为我在想类似的东西(代码只是一个例子)
$students = $db->query('SELECT id FROM students'); $teachers = $db->query('SELECT id FROM teachers');
现在,如果它在每次查询后关闭,那么这会减慢很多,而不是我只是将这一行添加到最后
$db->disconnectFromDB();
或者我应该在页面的最后包含上面的那一行?
有哪些优点/缺点?什么在你的情况下最有效?除了性能损失之外,忘记关闭mySQL连接有什么问题吗?
感谢您花时间回答.
谢谢!
据我所知,除非您使用持久连接,否则您的MySQL连接将在页面执行结束时关闭.
因此,您调用disconnect将不添加任何内容,因为您执行延迟连接,如果您或其他开发人员出错并在错误的时间断开连接,可能会导致创建第二个连接.
鉴于此,我只允许我的连接自动关闭.您的页面应该快速执行,因此在少量时间内保持连接不会导致任何问题.
我刚刚在PHP网站上阅读了有关持久连接的评论,可能有趣的是:
以下是不使用持久连接的重要原因概述:
当您锁定表时,通常在连接关闭时它会被解锁,但由于持久连接不会关闭,因此您意外离开的任何表都将保持锁定状态,解锁它们的唯一方法是等待连接超时或终止这个过程.事务发生同样的锁定问题.(见2002年4月23日和2003年7月12日的评论)
通常,在连接关闭时会删除临时表,但由于持久连接不会关闭,因此临时表不是那么临时.如果在完成后未显式删除临时表,则对于重新使用相同连接的新客户端,该表将已存在.设置会话变量时会出现同样的问题.(见以下评论于2004年11月19日和2006年8月7日)
如果PHP和MySQL位于同一服务器或本地网络上,则连接时间可以忽略不计,在这种情况下,持久连接没有任何优势.
Apache不能很好地与持久连接一起使用.当它收到来自新客户端的请求时,它不会使用已打开持久连接的可用子节点之一,而是会生成一个新子节点,然后必须打开一个新的数据库连接.这会导致过多的进程正在睡眠,浪费资源,并在达到最大连接时导致错误,此外它还会破坏持久连接的任何好处.(见2004年2月3日的评论,以及http://devzone.zend.com/node/view/id/686#fn1上的脚注 )
(我不是那个写上面文字的人)
不要打扰断开连接.$_connected
在每个查询之前检查的成本加上实际调用$db->disconnectFromDB();
以完成关闭的成本最终会比让PHP在每个页面完成时关闭连接更加昂贵.
推理:
1:如果您将连接保持打开状态直到脚本结束:
PHP引擎循环通过mysql连接的内部数组
PHP引擎在内部为每个连接调用mysql_close()
2:如果您自己关闭连接:
您必须检查$_connected
每个查询的值.这意味着PHP必须检查变量$_connected
A)是否存在B)是布尔值而C)是真/假.
你必须调用你的'disconnect'函数,函数调用是PHP中比较昂贵的操作之一.PHP必须检查你的函数A)是否存在,B)是非私有/受保护的,以及C)你为函数提供了足够的参数.它还必须在新的本地范围中创建$ connection变量的副本.
那么你的'disconnect'函数将调用mysql_close(),这意味着PHP A)检查mysql_close()是否存在,B)你已经为mysql_close()和C提供了所有需要的参数,它们是正确的类型(mysql资源).
我可能不是100%正确,但我相信这种可能性对我有利.