다중 프로세스 사용의 장점:
1. 使用多进程, 子进程结束以后, 内核会负责回收资源 2. 使用多进程,子进程异常退出不会导致整个进程Thread退出. 父进程还有机会重建流程. 3. 一个常驻主进程, 只负责任务分发, 逻辑更清楚.
PHP에서 다중 프로세스를 구현하려면 Let's Go.
설치해야 합니다. the pcnt 확장
pcntl 프로세스 제어의 약어입니다. 일반적으로 PHP는 이 확장을 기본적으로 설치합니다. phpinfo() 함수를 사용하여 확장이 존재하는지 확인하십시오.
pcntl_fork() 함수를 사용하여 하위 프로세스를 생성합니다.
pcntl_fork는 현재 프로세스와 동일한 하위 프로세스를 생성하는 것입니다. 이 하위 프로세스의 코드 세그먼트는 현재 프로세스와 정확히 동일합니다. 하지만 자체 데이터 세그먼트가 있습니다. 가장 간단한 하위 프로세스 생성 방법을 살펴보겠습니다.
<?php /** * hedong * @date 2017-04-03 */ $parentPid = getmypid(); // 获取父进程id $childPid = pcntl_fork(); // 创建子进程 switch($childPid) { case -1: print "创建子进程失败!".PHP_EOL; exit; case 0: print "我是子进程,进程ID:{$childPid}".PHP_EOL; break; default: print "我是父进程,进程ID:{$parentPid},子进程ID: {$childPid}".PHP_EOL; } ?>
pcntl_fork()调用成功以后,一个程序变成了两个程序:一个程序得到的$pid变量值是0,它是子进程;另一个程序得到的$pid的值大于0,这个值是子进程的PID,它是父进程。
출력 결과:
하위 프로세스 재활용
1 차단 방법
방금 ps를 얻었나요? 일반적으로 저는 실행 중인 백그라운드 프로세스를 찾기 위해 ps aux plus grep 명령을 사용하는 데 익숙합니다. 각 프로세스의 실행 상태를 식별하는 STAT 열이 있습니다. 여기서는 상태 Z: 좀비에 중점을 둡니다. 자식 프로세스가 부모 프로세스보다 먼저 종료되고 부모 프로세스가 아무 작업도 수행하지 않으면 자식 프로세스는 좀비 프로세스가 됩니다. 좀비 프로세스는 많은 메모리를 차지하지 않지만 눈에 거슬리는 프로세스입니다. (그들이 여전히 PID를 차지하고 있다는 것을 잊지 마세요)
일반적으로 말하면, 부모 프로세스가 끝나기 전에 죽은 자식 프로세스를 재활용하면 됩니다. pcntl 확장에는 pcntl_wait() 함수가 있습니다. 이 메서드는 프로세스가 끝날 때까지 기다렸다가 종료된 프로세스를 재활용합니다.
<?php /** * hedong * @date 2017-04-03 */ $parentPid = getmypid(); // 获取父进程id $childPid = pcntl_fork(); // 创建子进程 switch($childPid) { case -1: print "创建子进程失败!".PHP_EOL; exit; case 0: print "我是子进程,进程ID:{$childPid}".PHP_EOL; break; default: pcntl_wait($status); // 子进程执行完后才执行父进程 print "我是父进程,进程ID:{$parentPid},子进程ID: {$childPid}".PHP_EOL; }
② Non-blocking 방식
Blocking 방식은 다중 프로세스의 병렬성을 잃습니다. 완성된 하위 프로세스를 재활용하고 병렬화하는 방법도 있습니다. 이것이 논블로킹(Non-Blocking) 방식입니다.
<?php /** * hedong * @date 2017-04-03 */ for ($i = 1; $i <= 5; ++$i) { $pid = pcntl_fork(); // 创建子进程 if (!$pid) { sleep(1); print "In child $i\n"; exit($i); } } // pcntl_waitpid 第一个参数为 0 代表处理全部子进程 while (pcntl_waitpid(0, $status) != -1) { $status = pcntl_wexitstatus($status); echo "Child $status completed\n"; }
부모 프로세스가 먼저 죽으면 어떻게 되나요?
무슨 일이 일어날까요? 아무 일도 일어나지 않고 하위 프로세스가 계속 실행 중입니다. 그러나 이때 자식 프로세스는 1번 프로세스에 넘겨지게 되며, 1번 프로세스는 이들 자식 프로세스의 계부가 됩니다. 프로세스 1번은 이러한 프로세스의 리소스를 잘 관리하고, 프로세스 1번은 프로세스가 종료되면 자동으로 리소스를 회수합니다. 따라서 좀비 프로세스를 처리하는 또 다른 임시 방법은 상위 프로세스를 종료하는 것입니다.
마지막 주의사항:
프로세스 제어는 웹 서버 환경에서 적용할 수 없습니다. 웹 서비스 환경에서 사용하면 예상치 못한 결과가 발생할 수 있습니다. -- PHP 매뉴얼에서 발췌
참조:
http://www.hackingwithphp.com/16/1/3/getting-into-multiprocessing http://www.jb51.net/article/71232.htm http://www.laruence.com/2009/06/11/930.html http://imhuchao.com/596.html https://www.pureweber.com/article/php-multi-process-programming-preview/