2008-10-02 10 views
1

system() 호출을 사용하여 다른 (잠재적으로 장기 실행되는) 프로그램을 실행하는 PHP 스크립트가 있습니다 (NCBI BLAST, phrap, primer3 및 DNA 서열 분석 및 어셈블리를위한 다른 프로그램).PHP 4 및 5, Ctrl-C, system() 및 하위 프로세스

저는 Windows XP에서 명령 프롬프트에서 PHP의 CLI 버전을 사용하거나 서비스로 실행 중입니다. (두 경우 모두 데이터베이스 테이블의 작업 대기열을 통해 통신합니다.)

PHP4에서

: 나는 Ctrl 키 + C을 쳤을 때 스크립트가 정지하고 시간에 실행하는 자식 프로세스도 중지됩니다. PHP5에서 : Ctrl + C 스크립트는 멈추지 만 자식은 계속 실행됩니다.

마찬가지로 스크립트를 서비스로 실행하면 PHP4로 실행하면서 서비스를 중지하면 PHP5가 실행되고 자식이 계속 실행됩니다.

필자는 최소한의 테스트 응용 프로그램을 작성하려고 시도했으며 동일한 동작을 발견했습니다. 테스트 PHP 스크립트는 system()을 사용하여 C 프로그램을 실행 한 다음 (30 초 동안 잠자기 상태로 유지) 키를 누를 때까지 대기합니다.

PHP 4.4.9 및 5.2.6의 소스를 살펴 보았지만 system() 코드에 차이점이없는 것을 확인할 수있었습니다. 또한 CLI 응용 프로그램의 시작 코드를 간략히 살펴본 결과 신호 처리에 차이점이 없었습니다.

이 문제의 원인이나 해결 방법에 대한 힌트를 제공해 주시면 감사하겠습니다.

감사합니다.

+0

어느 것이 바람직한 행동입니까? – Glomek

+0

PHP 4 동작 - 아이들도 멈 춥니 다. –

답변

1

이 문제는 PHP 5.1.2 이상에서 발생합니다.

SIGINT가 Ctrl + C 또는 Ctrl + Break를 통해 전송되면 처리기가 호출됩니다. 이 핸들러가 다른 자식에게 SIGTERM을 보내면 신호가 수신되지 않습니다.

SIGINT는 posix_kill()을 통해 전송할 수 있으며 예상대로 작동합니다. 이는 하드 브레이크를 통해 시작된 경우에만 적용됩니다. 에서

: http://php.oregonstate.edu/manual/en/function.pcntl-signal.php

이 문서는 CTRL + C를 트래핑과 아이들에게 posix_kill을 보내기위한 샘플 코드가 있습니다. 아동용 세차 및 신호에 대한 다른 코드와 정보가 많이 있습니다.