Symfony2& Doctrine SQLSTATE [HY000] [1040]连接太多

时间:2014-04-19 15:06:29

标签: php symfony doctrine-orm

下面的父命令异步调用另一个子命令。

父命令

foreach ( $values as $value ) {
    // asynchronous call
    shell_exec(sprintf('php app/console {child command} %d > /dev/null &', $value));
}

儿童指挥

$em = $this->getContainer()->get('doctrine')->getEntityManager();
// some database action

执行父命令时,发生以下错误。

  

[PDOException]
    SQLSTATE [HY000] [1040]连接太多

我认为关闭数据库连接存在问题。

所以我添加了

$em->getConnection()->close();

在最后一个子命令中,但结果没有改变。

1 个答案:

答案 0 :(得分:1)

close()没有帮助,因为您正在向backgruond发送进程(因为命令末尾有&),这使得命令并行执行。问题是MySQL服务器的最大同时连接数量有限。

您可以做的是限制进程的产生,因此您不会产生例如一次超过5个是等待第5个过程完成,然后产生另外5个。如果这些过程需要相似的时间来完成,这将是有效的:

$i = 0;
foreach ( $values as $value ) {
    $i++
    // make asynchronous call for first 4 processes
    if ($i < 5) {
        shell_exec(sprintf('php app/console {child command} %d > /dev/null &', $value));
    } else {
          // wait for 5th process to finish before spawning more
          shell_exec(sprintf('php app/console {child command} %d > /dev/null', $value));
          $i = 0;
    }
}

然后基本上将可生成进程的数量调整为MySQL服务器上同时连接的限制。