2014-04-19 5 views
1

아래의 parent 명령은 다른 자식 명령을 비동기 적으로 호출합니다.Symfony2 & Doctrine SQLSTATE [HY000] [1040] 연결이 너무 많음

상위 명령

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

내 질문을 업데이트 해 주셔서 감사합니다. 이것은 스택 오버플로에 대한 나의 첫 번째 질문이므로 질문을 작성하는 방법에 대해 불안합니다. – user3551918

답변

1

close()은 명령을 병렬로 실행하는 backgruond (명령 끝에 &이 있기 때문에) 프로세스를 보내기 때문에 도움이되지 않았습니다. 문제는 MySQL 서버에 최대 동시 연결 수가 제한되어 있다는 것입니다.

당신이 할 수있는 것은 프로세스의 스폰을 제한하는 것입니다.

$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; 
    } 
} 

그런 다음 기본적으로 spawnable 프로세스의 수를 조정 : 한 번에 5보다 그 프로세스가 완료 시간과 비슷한 시간이 걸릴 경우에 효과적 일 것이다 또 다른 5 산란 전에 완료 5 프로세스를 기다리라는 것입니다 MySQL 서버의 동시 연결 한계가 설정됩니다.

+0

빠른 답장을 보내 주신 edvinas.me 씨께 감사드립니다. 내가 이해할 수. 큰 도움이됩니다! – user3551918

관련 문제