이 글은 주로 PHP 다중 프로세스 프로그래밍의 좀비 프로세스 문제를 이해하기 위한 관련 정보를 소개합니다. 이 글이 모든 사람이 이 부분을 마스터하는 데 도움이 되기를 바랍니다. 좀비 프로세스 문제에 대한 이해
pcntl_fork 함수를 사용하면 PHP가 다중 프로세스 동시성 또는 비동기 처리 효과를 얻을 수 있습니다. http://www.jb51.net/article/125789.htm
그러면 문제는 다음과 같습니다. 우리가 생성하는 프로세스는 무시하는 것이 아니라 통제되어야 합니다. 가장 기본적인 방법은 프로세스를 분기하고 프로세스를 종료하는 것입니다. pcntl_fork 함수를 사용하면 이미 새로운 하위 프로세스가 있고 하위 프로세스가 처리해야 할 작업을 완료하므로 당분간은 이를 service()라고 부르겠습니다. 다시 이전 요구 사항을 참조하면 상위 프로세스는 루프에서 구성 파일을 읽고 파일이 변경될 때까지 기다려야 합니다. pcntl_fork를 사용하면 다음 코드를 쉽게 작성할 수 있습니다.$res = config(); //kill进程 for($i = 0; $i < $res[sum]; $i++) { $pid = pcntl_fork(); if ($pid == 0) { service(); return; } }
코드의 주석에서 구성 파일이 변경되면 프로세스를 종료해야 합니다. 프로세스를 종료하는 방법은 매우 간단합니다. 예를 들어, 직접 죽이는 kill 명령(pid는 123이라고 가정):
1 kill 123
그러나 프로세스를 죽이는 이 방법을 사용해도 실제로는 자식 프로세스가 죽은 후에도 남아 있는 것으로 나타났습니다. 이 프로세스의 자원을 점유함으로써 우리는 좀비 프로세스가 됩니다. 좀비 프로세스는 kill 명령을 사용하여 종료될 수 없습니다. 이 문제를 해결할 수 있는 방법은 두 가지뿐입니다.
pcntl_wait($status); //等待子进程中断,防止子进程成为僵尸进程。
프로세스가 좀비 프로세스가 되는 것을 방지할 수 있는 방법이 있다고 하는데, 공식 홈페이지에서 제공하는 코드는 다음과 같습니다. 이거:
$pid = pcntl_fork(); //父进程和子进程都会执行下面代码 if ($pid == -1) { //错误处理:创建子进程失败时返回-1. die('could not fork'); } else if ($pid) { //父进程会得到子进程号,所以这里是父进程执行的逻辑 pcntl_wait($status); //等待子进程中断,防止子进程成为僵尸进程。 } else { //子进程得到的$pid为0, 所以这里是子进程执行的逻辑。 }
모직물이 무슨 뜻인가요? 즉, 상위 프로세스는 하위 프로세스가 실행될 때까지 대기하며 하위 프로세스의 실행이 끝나면 다음 단계로 진행되며 좀비 프로세스도 제거됩니다. 그러나 이는 우리의 요구 사항을 충족하지 않습니다. 우리의 하위 프로세스는 끊임없이 출력을 검색하는 무한 루프 프로그램이며 업데이트가 완료되지 않으며 필요한 것은 동기화가 아닌 비동기 처리입니다. 그런데 이 방법을 사용할 수 있나요? 실제로 물론 가능합니다.
posix_kill(123, 9); pcntl_wait($status);
이러한 방식으로 먼저 kill을 사용하여 프로세스를 종료하면 프로세스가 다시 실행되지 않습니다. this 프로세스는 좀비 프로세스가 되어 리소스를 점유합니다. 다음 문장에서는 이러한 좀비 프로세스가 리소스를 해제하도록 하기 위해 pcntl_wait()를 실행합니다. 이렇게 하면 하위 프로세스가 실제로 종료되고 좀비 프로세스가 제거됩니다.
위 내용은 PHP 다중 프로세스의 좀비 프로세스 문제 해결 방법에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!