【问题标题】:Too many connections Error due to many sleep connections连接过多 睡眠连接过多导致错误
【发布时间】:2013-07-03 14:38:14
【问题描述】:

PHP mysql_connect 有时会因为“连接太多”而失败。 在检查进程状态列表时,我注意到当这种情况发生时,有很长的进程处于睡眠状态。多久?时间:28490

这就是我初始化连接的方式:

            $this->connection[$server] = mysql_connect( $credentials['dbUrl'], $credentials['dbUser'], $credentials['dbPass'], true);

这种情况并不总是发生,只是有时连接会“卡住”。我认为这可能与页面上的某些内容未完成有关(图像未加载?外部服务卡住?)。剧本什么时候正式完成?是在页面完全加载之后吗?

我想到了两种可能的解决方案: 1.使用mysql_close。 2. 更改最大 mysql 超时 (/etc/my.cnf) 3. 处理脚本超时。

什么原因会导致连接陷入“睡眠”状态? 您建议如何解决/进一步调查该问题?

【问题讨论】:

  • 由于看起来是PHP,所以脚本完成后应该释放连接,完全独立于图像和其他嵌入内容加载。如果您的 php 脚本挂起,则连接仍然存在。
  • @JoachimIsaksson 什么会导致 php 脚本挂起?
  • 有很多原因,通常是一个永远不会终止的循环,或者等待一些从未真正发生过的外部事情发生。
  • 我认为 apache max_execution_time 应该涵盖这些原因。也许我应该看看为什么它没有正确配置?

标签: php mysql web-services apache


【解决方案1】:

一个很好的解决方案是将您的连接放入一个函数中,然后添加一个析构函数来为您关闭连接。这样连接会在最后一次调用 mysql 连接后自动关闭。

class DbConn {
    public $connection;

    public function __construct($host, $name, $user, &$pass) {
        $this->connection = mysql_connect(mysql_connect($host, $user, $pass);
        if(mysql_connect_errno) {
            echo mysql_connect_error;
        } else {
            mysql_select_db($name, $this->connection);
        }
        unset($pass); //Clear password for security.
    }

    public function __destruct() {
        mysql_close($this->connection);
    }
}

这应该处理大多数打开的连接,因为它们会在脚本结束之前关闭,即使脚本挂在图像上,连接也会在最后一个查询运行后关闭。您可能仍会得到一些,但不足以导致 too many connections 错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多