下面的父命令异步调用另一个子命令。
父命令
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();
在最后一个子命令中,但结果没有改变。
答案 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服务器上同时连接的限制。