2012-02-21 9 views
3

나는 여러 부분으로 작업을 나누고 별도의 하위 프로세스에서 각 부분을 실행하는 PHP 스크립트를 가지고 있습니다.php 일부 fork 된 프로세스가 계속 실행 중임

foreach($users as $k => $arr) { 
    if(($pid = pcntl_fork()) === -1) continue; 
    if($pid) { 
     pcntl_wait($status,WNOHANG); 
     continue; 
    } 
    ob_start(); 
    posix_setsid(); 
    dbConnect(); 
    // do stuff to data 
    exit(); 
} 

내가 데비안 서버의 crontab을 사용하여이 스크립트를 실행 해요,하지만 문제는 어떤 프로세스가 실행 및 예비 메모리를 유지하는 것입니다 : 코드는 다음과 같습니다. 잠시 후 서버의 메모리가 넘치게됩니다. 모든 프로세스가 올바르게 완료되도록하는 방법을 찾아야합니다.

답변

3

나는이 문제가 pcntl_wait 호출에서 WNOHANG의 사용이라고 생각한다. 즉, 다른 하위 프로세스를 동시에 포크 할 수있게하려면 원하는 자식 프로세스 앞에 pcntl_wait 함수가 있어야합니다. 그러나 그것은 부모 중 일부가 아이들 앞에서 끝나 버리는 부작용이 있습니다. 이 링크 http://www.devshed.com/c/a/PHP/Managing-Standalone-Scripts-in-PHP/2/은 모든 어린이가 완료 할 때까지 WNOHANG을 사용하여 pcntl_wait를 사용하여 루프하는 방법을 설명합니다. 문제가이 문제를 제거하는 코드를 정상화해야하지만, 문제가 바로 페이지 실행 시간 제한을 초과하는 경우, 당신이 행을 추가 할 수 있습니다 Low memory 경우

+0

덕분에이 일을 작정 이제 부모 프로세스는 모든 자식 프로세스가 종료되기 전에 실행을 마칠 때까지 대기합니다. – abugnais

0

데이터에 수행하는 작업은 오래 걸립니다. 실행하는 작업을 디버깅해야합니다.

관련 문제