PHP 다중 프로세스의 좀비 프로세스 문제 해결 방법에 대한 자세한 설명

黄舟
풀어 주다: 2023-03-16 16:32:02
원래의
1804명이 탐색했습니다.

이 글은 주로 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 명령을 사용하여 종료될 수 없습니다. 이 문제를 해결할 수 있는 방법은 두 가지뿐입니다.

1. shutdown

2. 이 프로세스의 상위 프로세스를 종료합니다.

그러나 이 방법 중 어느 것도 작동하지 않습니다. 이 프로그램의 목적은 서버를 모니터링하고 상주하는 것이므로 서버를 종료할 수 없으며 상위 프로세스를 종료할 수 없습니다. 이때 공식 문서에서 포크 방식에 대한 설명을 봤습니다.

pcntl_wait($status); //等待子进程中断,防止子进程成为僵尸进程。
로그인 후 복사

프로세스가 좀비 프로세스가 되는 것을 방지할 수 있는 방법이 있다고 하는데, 공식 홈페이지에서 제공하는 코드는 다음과 같습니다. 이거:

$pid = pcntl_fork();
//父进程和子进程都会执行下面代码
if ($pid == -1) {
  //错误处理:创建子进程失败时返回-1.
   die(&#39;could not fork&#39;);
} else if ($pid) {
   //父进程会得到子进程号,所以这里是父进程执行的逻辑
   pcntl_wait($status); //等待子进程中断,防止子进程成为僵尸进程。
} else {
   //子进程得到的$pid为0, 所以这里是子进程执行的逻辑。
}
로그인 후 복사

모직물이 무슨 뜻인가요? 즉, 상위 프로세스는 하위 프로세스가 실행될 때까지 대기하며 하위 프로세스의 실행이 끝나면 다음 단계로 진행되며 좀비 프로세스도 제거됩니다. 그러나 이는 우리의 요구 사항을 충족하지 않습니다. 우리의 하위 프로세스는 끊임없이 출력을 검색하는 무한 루프 프로그램이며 업데이트가 완료되지 않으며 필요한 것은 동기화가 아닌 비동기 처리입니다. 그런데 이 방법을 사용할 수 있나요? 실제로 물론 가능합니다.

이 함수는 pcntl_wait 문서에 설명되어 있습니다.

대기 함수는 하위 프로세스가 종료되거나 현재 프로세스를 중단하거나 신호 처리 함수를 호출하라는 신호를 받을 때까지 현재 프로세스의 실행을 스크랩합니다. 이 함수가 호출될 때 자식 프로세스(일반적으로 좀비 프로세스라고 함)가 종료된 경우 이 함수는 즉시 반환됩니다. 하위 프로세스에서 사용하는 모든 시스템 리소스가 해제됩니다. 시스템에서 대기가 작동하는 방식에 대한 자세한 사양은 시스템의 wait(2) 설명서를 참조하세요.

우리는 이 함수가 자식 프로세스가 좀비 프로세스가 되었음을 발견하면 좀비 프로세스의 리소스를 해제한다는 것을 발견했습니다. 단, 좀비 프로세스가 부모 프로세스의 자식 프로세스인 경우에 한합니다. 그런 다음 이 방법을 영리하게 사용하여 좀비 프로세스가 리소스를 해제하도록 할 수 있으므로 다음과 같은 코드가 있습니다.

 posix_kill(123, 9);
 pcntl_wait($status);
로그인 후 복사

이러한 방식으로 먼저 kill을 사용하여 프로세스를 종료하면 프로세스가 다시 실행되지 않습니다. this 프로세스는 좀비 프로세스가 되어 리소스를 점유합니다. 다음 문장에서는 이러한 좀비 프로세스가 리소스를 해제하도록 하기 위해 pcntl_wait()를 실행합니다. 이렇게 하면 하위 프로세스가 실제로 종료되고 좀비 프로세스가 제거됩니다.

위 내용은 PHP 다중 프로세스의 좀비 프로세스 문제 해결 방법에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿