缓慢的PHP脚本导致MySQL服务器进入休眠状态(使用pconnect())

时间:2011-07-19 19:57:44

标签: php mysql

我遇到了MySQL睡眠的问题,因为PHP脚本需要太长时间..然后mysql服务器没有响应,直到完成睡眠过程。然后花一点时间来执行任何类型的数据库请求(如果删除SLEEP进程,则会更快)。

我使用pconnect()连接到服务器,我被告知这可能导致问题。是的,如果是这样,为什么持久连接会停止这样的工作?

3 个答案:

答案 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
  •   

See here for more info.

答案 2 :(得分:0)

问题是你在mysql_pconnect上打开的持久连接在PHP端超时之前会在MySQL端超时,导致PHP尝试使用僵尸连接。你需要确保MySQL端的超时时间比PHP端要长,以防止这种情况发生。

此页面还声称您可以使用mysql_ping()来解决此问题:

http://www.php.net/manual/en/function.preg-match.php

如果性能良好,您也可以切换到mysql_connect。