我遇到了MySQL睡眠的问题,因为PHP脚本需要太长时间..然后mysql服务器没有响应,直到完成睡眠过程。然后花一点时间来执行任何类型的数据库请求(如果删除SLEEP进程,则会更快)。
我使用pconnect()
连接到服务器,我被告知这可能导致问题。是的,如果是这样,为什么持久连接会停止这样的工作?
答案 0 :(得分:1)
如果连接的先前用户异常中止,持久连接可能会留下“垃圾”。考虑使用一系列单个查询进行事务的情况。中途,我们假设远程用户终止了连接,导致脚本中止。因为mysql连接是持久的,所以当脚本退出时它不会被关闭,并使事务保持打开状态。
MySQL无法知道它应该进行回滚,因此它处于正在运行的事务中,等待另一个查询进入。
当此连接被另一个脚本重用时,该脚本也无法知道某个事务正在进行中,并且只会开始发出自己的查询。
这很容易导致死锁,因为所有这些“陈旧”交易都被部分复制。如果您的脚本由于某种原因更改了任何服务器端设置,那么这些设置也将基于每个连接保持等等...
换句话说,除非您非常小心您的代码,否则持久连接将导致一系列很难诊断的奇怪行为,因为每个连接对于使用它们的每个脚本都处于不同的状态。
答案 1 :(得分:0)
持久连接在不执行任何操作时保持打开状态。如果设置为短暂超时,它将进入睡眠状态,需要再次唤醒才能使用。
实际上需要持久连接是非常罕见的,并且在脚本中不重新打开与MySQL服务器的连接所节省的时间似乎在睡眠/唤醒过程中被浪费了。我建议你切换到普通的mysql_connect()
。如有必要,您可以关闭数据库连接并稍后在脚本中重新建立。
如果您的Web服务器和数据库服务器位于同一台计算机上,则通过持久连接几乎不会节省成本。根据PHP文档中的评论(我知道它们不是最好的资源)Apache在mysql_pconnect()
- Apache与持久连接不兼容。当它 收到来自新客户的请求,而不是使用其中一个 它已经打开了持久连接的可用子节点 往往会产生一个新的孩子,然后必须打开一个新的数据库 连接。这导致过多的进程正在睡觉, 浪费资源,并在达到最大值时导致错误 连接,加上它会破坏持久连接的任何好处。 (见下文于2004年2月3日的评论,以及脚注于 http://devzone.zend.com/node/view/id/686#fn1)
答案 2 :(得分:0)
问题是你在mysql_pconnect上打开的持久连接在PHP端超时之前会在MySQL端超时,导致PHP尝试使用僵尸连接。你需要确保MySQL端的超时时间比PHP端要长,以防止这种情况发生。
此页面还声称您可以使用mysql_ping()来解决此问题:
http://www.php.net/manual/en/function.preg-match.php
如果性能良好,您也可以切换到mysql_connect。