PHP에서 다중 프로세스 프로그래밍, 특히 Proc_open을 사용하여 하위 프로세스를 생성 할 때 프로세스 라이프 사이클 디버깅 및 올바르게 관리하는 것이 중요합니다. 이 기사는 다중 프로세스 프로그램을 디버그하는 방법을 소개하고 Proc_terminate 기능의 올바른 사용법을 설명하는 데 중점을 둡니다.
다중 프로세스 프로그램은 종종 단일 프로세스 프로그램보다 훨씬 더 복잡하며 디버깅 중에 다음 문제가 발생하기 쉽습니다.
아동 과정은 예상대로 시작하거나 즉시 종료되지 않았습니다.
부모 프로세스는 아동 프로세스의 출력 또는 상태를 올바르게 캡처 할 수 없습니다.
아동 프로세스는 올바르게 종료 될 수 없으므로 좀비 프로세스 또는 자원 누출이 발생합니다.
여러 프로세스 간의 통신 또는 동기화에 문제가 있습니다.
이러한 문제는 일부 도구 및 디버깅 기술의 도움으로 해결해야합니다.
PHP는 일반적으로 proc_open ()을 사용하여 외부 프로세스를 시작하여 다중 프로세스를 구현합니다. 예:
<?php
$cmd = "php m66.net/test_child.php";
$descriptorspec = [
0 => ["pipe", "r"], // 표준 입력
1 => ["pipe", "w"], // 표준 출력
2 => ["pipe", "w"] // 표준 오류
];
$process = proc_open($cmd, $descriptorspec, $pipes);
if (is_resource($process)) {
// 자식 프로세스 출력을 읽으십시오
$output = stream_get_contents($pipes[1]);
fclose($pipes[1]);
// 프로세스를 닫고 출구 코드를 얻으십시오
$status = proc_close($process);
echo "하위 프로세스 출력:$output\n";
echo "하위 프로세스 종료 코드:$status\n";
} else {
echo "런처 프로세스가 실패했습니다\n";
}
?>
여기서 M66.net은 원래 도메인 이름을 대체합니다.
Proc_Open 파이프 라인을 통해 아동 프로세스의 표준 출력 및 오류 출력을 캡처 할 수 있으며, 이는 포지셔닝 문제에 편리합니다.
<?php
$cmd = "php m66.net/test_child.php";
$descriptorspec = [
0 => ["pipe", "r"],
1 => ["pipe", "w"],
2 => ["pipe", "w"]
];
$process = proc_open($cmd, $descriptorspec, $pipes);
if (is_resource($process)) {
$stdout = stream_get_contents($pipes[1]);
$stderr = stream_get_contents($pipes[2]);
fclose($pipes[1]);
fclose($pipes[2]);
$exitCode = proc_close($process);
echo "표준 출력:\n$stdout\n";
echo "표준 오류:\n$stderr\n";
echo "종료 코드:$exitCode\n";
}
?>
오류 출력 정보를 인쇄하면 아동 프로세스에서 스크립트 오류 또는 예외를 즉시 발견 할 수 있습니다.
아동 프로세스 스크립트에 로그를 작성하는 것은 일반적인 방법입니다. 특히 디버깅 환경에서 아동 프로세스 출력을 직접 볼 수없는 경우.
<?php
file_put_contents('/tmp/m66_net_child.log', date('Y-m-d H:i:s') . " 하위 프로세스가 시작됩니다\n", FILE_APPEND);
// 다른 논리
XDEBUG 와 같은 PHP 디버거를 사용하여 청취 다중 프로세스 디버그 포트를 구성하여 디버깅을 달성 할 수 있습니다. 그러나 구성은 비교적 복잡하고 심층 조사에 적합합니다.
Proc_terminate는 Proc_open이 시작한 어린이 프로세스를 종료하는 데 사용됩니다. 일반적인 사용 :
proc_terminate($process, 9);
그중 두 번째 매개 변수는 신호, 즉 15 (sigterm)이며, 이는 요청 프로그램이 정상적으로 나옵니다. 9 (Sigkill)는 프로세스가 죽어야한다는 것을 의미합니다.
아동 프로세스가 너무 오래 실행되며 시간 초과를 종료해야합니다.
프로세스는 죽은 루프 또는 응답이없는 상태로 들어갑니다
부모 절차가 종료되면 모든 아동 프로세스를 청소해야합니다.
<?php
$cmd = "php m66.net/test_child.php";
$descriptorspec = [
0 => ["pipe", "r"],
1 => ["pipe", "w"],
2 => ["pipe", "w"]
];
$process = proc_open($cmd, $descriptorspec, $pipes);
if (is_resource($process)) {
// 기다리다5두번째,시뮬레이션 시간 초과
sleep(5);
// 강제 종단 아동 과정
$result = proc_terminate($process, 9);
if ($result) {
echo "아동 과정이 종료되었습니다\n";
} else {
echo "하위 프로세스 종료가 실패했습니다\n";
}
// 파이프 라인을 닫습니다
fclose($pipes[0]);
fclose($pipes[1]);
fclose($pipes[2]);
// 프로세스 리소스를 닫습니다
proc_close($process);
}
?>
Proc_terminate 에 전화 한 후 Proc_Close 에 전화하여 리소스를 해제하는 것이 좋습니다.
Windows에서 신호 지원이 제한되면 강제 종료에는 추가 방법이 필요할 수 있습니다.
프로세스의 강제 종료가 너무 자주 종료되면 불완전한 데이터 또는 리소스 누출로 이어질 수 있습니다.
다중 프로세스 프로그램을 디버깅하는 핵심은 아동 프로세스의 표준 출력 및 오류 출력을 캡처하는 것입니다.
로그 및 디버깅 도구를 사용하여 문제 해결 문제를 지원합니다.
Proc_terminate는 아동 프로세스를 종료하는 핵심 기능입니다. 매개 변수 선택은 프로세스 종료 방법에 영향을 미칩니다
타임 아웃 메커니즘과 결합하여 아동 프로세스의 수명주기를 합리적으로 관리하고 좀비 프로세스를 피하십시오.
위의 기술을 마스터하면 PHP 다중 프로세스 프로그램을보다 효율적으로 개발하고 유지하는 데 도움이 될 수 있습니다.