2012-11-06 9 views
3

PHP로 작성된 많은 수의 Linux 데몬이 있습니다. 일부 배경 작업을 수행합니다. 가끔은 pcntl_fork을 통해 작업자 프로세스를 생성하고 제어하는 ​​하나의 "마스터"프로세스가 있습니다.Daemonized PHP : 자식 프로세스가 종료 될 때 마스터 프로세스가 종료됩니다.

private function SpawnWorker($realm, $parallelismKey) 
{ 
    $pid = pcntl_fork(); 

    if ($pid) 
    { 
    $worker = DaemonInstance::Create($pid, $realm, $parallelismKey); 
    $worker->Store(); 
    $this->workers[$pid] = $worker; 
    return $worker; 
    } 

    else if ($pid == 0) // we're in child process now 
    return Daemon::REINCARNATE; 

    else 
    xechonl("#red#UNABLE TO SPAWN A WORKER ($realm, $parallelismKey)"); 

    return false; 
} 

로 돌아온 후 값은 새로운 작업자 프로세스는 새로운 세션 ID를 반환 posix_setsid를 호출 "환생"여기

는 (아주 사소한) 코드입니다. 그러나이 프로세스가 충돌하면 마스터 프로세스도 자동으로 종료됩니다.

이 동작을 방지하고 전체 시스템을보다 강력하게 만들 수 있습니까?

답변

0

새 프로세스는 하위 프로세스가 아닌 상위 프로세스에 생성합니다.

$pid = pcntl_fork(); 
if ($pid == -1) { 
    // could not daemonize 
    exit(1); 
} elseif ($pid > 0) { 
    exit(0); // already daemonized (we are the parent process) 
} else { 
    umask(0); 
    $sid = posix_setsid(); 
    if ($sid < 0) { 
     exit(1); // could not detach session id (could not create child) 
    } 

    // capture output and errors 
    fclose(STDIN); fclose(STDOUT); fclose(STDERR); 
    $STDIN = fopen('/dev/null', 'r'); 
    $STDOUT = fopen('/dev/null', 'wb'); 
    $STDERR = fopen('/dev/null', 'wb'); 

    // ADD CODE HERE 

}

: 여기 내가 사용하는 몇 가지 표준 코드입니다
관련 문제