이 글은 주로 PHP 다중 프로세스 실행 작업에 대한 지침을 소개합니다. 이제 특정 참조 값을 공유합니다. 필요한 친구가 참조할 수 있습니다.
지정된 수의 여러 작업을 동시에 실행합니다. 프로세스 수 제어
프로세스는 서로 독립적이며 서로 영향을 미치지 않습니다.
코드 예:
<?php $task = 0; //任务id $taskNum = 10; //任务总数 $processNumLimit = 2; //子进程总量限制 while(true){ //产生分支 $processid = pcntl_fork(); //创建子进程失败 if( $processid == -1 ){ echo "create process error!\n"; exit(1); } //主进程,获得子进程pid elseif($processid){ $task++; //下一个任务 $currentProcessid = posix_getpid(); //当前进程的Id $parentProcessid = posix_getppid(); // 父级进程的ID $phpProcessid = getmypid(); //当前php进程的id echo "task:",$task,"\tprocessid:",$processid,"\tcurrentProcessid:",$currentProcessid,"\tparentProcessid:",$parentProcessid,"\tphpProcessid:",$phpProcessid,"\n"; //控制进程数 if($task >= $processNumLimit) { echo "wait chl start!\n"; $exitid = pcntl_wait($status); //等待退出 echo "wait chl end!extid:",$exitid,"\tstatus:",$status,"\n"; } //任务总量控制 if($task >= $taskNum) { echo "taskNum enough!\n"; break; } } //processid=0为新创建的进程 else{ //模拟不同任务的不同执行时长 $sleep = rand(1, 5); $currentProcessid = posix_getpid(); //当前进程的Id $parentProcessid = posix_getppid(); // 父级进程的ID $phpProcessid = getmypid(); //当前php进程的id echo "task:",$task,"\tprocessid:",$processid,"\tcurrentProcessid:",$currentProcessid,"\tparentProcessid:",$parentProcessid,"\tphpProcessid:",$phpProcessid,"\tsleep:",$sleep,"\tbegin!\n"; sleep($sleep); echo "task:",$task,"\tprocessid:",$processid,"\tcurrentProcessid:",$currentProcessid,"\tparentProcessid:",$parentProcessid,"\tphpProcessid:",$phpProcessid,"\tsleep:",$sleep,"\tend!\n"; exit(0); //子进程执行完后退出,防止进入循环创建子进程 } }
실행 결과:
task:1 processid:32225 currentProcessid:32224 parentProcessid:15053 phpProcessid:32224 task:0 processid:0 currentProcessid:32225 parentProcessid:32224 phpProcessid:32225 sleep:5 begin! task:2 processid:32226 currentProcessid:32224 parentProcessid:15053 phpProcessid:32224 wait chl start! task:1 processid:0 currentProcessid:32226 parentProcessid:32224 phpProcessid:32226 sleep:2 begin! task:1 processid:0 currentProcessid:32226 parentProcessid:32224 phpProcessid:32226 sleep:2 end! wait chl end!extid:32226 status:0 task:3 processid:32228 currentProcessid:32224 parentProcessid:15053 phpProcessid:32224 wait chl start! task:2 processid:0 currentProcessid:32228 parentProcessid:32224 phpProcessid:32228 sleep:1 begin! task:2 processid:0 currentProcessid:32228 parentProcessid:32224 phpProcessid:32228 sleep:1 end! wait chl end!extid:32228 status:0 task:4 processid:32229 currentProcessid:32224 parentProcessid:15053 phpProcessid:32224 wait chl start! task:3 processid:0 currentProcessid:32229 parentProcessid:32224 phpProcessid:32229 sleep:2 begin! task:0 processid:0 currentProcessid:32225 parentProcessid:32224 phpProcessid:32225 sleep:5 end! wait chl end!extid:32225 status:0 task:5 processid:32270 currentProcessid:32224 parentProcessid:15053 phpProcessid:32224 wait chl start! task:4 processid:0 currentProcessid:32270 parentProcessid:32224 phpProcessid:32270 sleep:1 begin! task:3 processid:0 currentProcessid:32229 parentProcessid:32224 phpProcessid:32229 sleep:2 end! wait chl end!extid:32229 status:0 task:6 processid:32271 currentProcessid:32224 parentProcessid:15053 phpProcessid:32224 wait chl start! task:5 processid:0 currentProcessid:32271 parentProcessid:32224 phpProcessid:32271 sleep:4 begin! task:4 processid:0 currentProcessid:32270 parentProcessid:32224 phpProcessid:32270 sleep:1 end! wait chl end!extid:32270 status:0 task:7 processid:32273 currentProcessid:32224 parentProcessid:15053 phpProcessid:32224 wait chl start! task:6 processid:0 currentProcessid:32273 parentProcessid:32224 phpProcessid:32273 sleep:1 begin! task:6 processid:0 currentProcessid:32273 parentProcessid:32224 phpProcessid:32273 sleep:1 end! wait chl end!extid:32273 status:0 task:8 processid:32274 currentProcessid:32224 parentProcessid:15053 phpProcessid:32224 wait chl start! task:7 processid:0 currentProcessid:32274 parentProcessid:32224 phpProcessid:32274 sleep:2 begin! task:5 processid:0 currentProcessid:32271 parentProcessid:32224 phpProcessid:32271 sleep:4 end! task:7 processid:0 currentProcessid:32274 parentProcessid:32224 phpProcessid:32274 sleep:2 end! wait chl end!extid:32274 status:0 task:9 processid:32277 currentProcessid:32224 parentProcessid:15053 phpProcessid:32224 wait chl start! wait chl end!extid:32271 status:0 task:8 processid:0 currentProcessid:32277 parentProcessid:32224 phpProcessid:32277 sleep:2 begin! task:10 processid:32278 currentProcessid:32224 parentProcessid:15053 phpProcessid:32224 wait chl start! task:9 processid:0 currentProcessid:32278 parentProcessid:32224 phpProcessid:32278 sleep:2 begin! task:8 processid:0 currentProcessid:32277 parentProcessid:32224 phpProcessid:32277 sleep:2 end! task:9 processid:0 currentProcessid:32278 parentProcessid:32224 phpProcessid:32278 sleep:2 end! wait chl end!extid:32277 status:0 taskNum enough
pcntl_fork가 하위 프로세스를 생성한 후 하위 프로세스는 함수 코드를 실행하고 상위 프로세스는 계속해서 작업 ID를 증가시키고 다음 프로세스를 생성합니다.
pcntl_wait를 사용하여 하위 프로세스의 실행이 완료되고 종료될 때까지 기다린 다음 새 프로세스를 생성하여 총 프로세스 수를 제어합니다.
주 프로세스 생성이 완료된 후 다음을 통해 루프를 종료합니다. 부서지다. 현재 실행 중인 하위 프로세스가 있을 수 있습니다.
현재 프로세스의 현재 위치에 브랜치(자식 프로세스)를 생성합니다. 성공하면 생성된 자식 프로세스의 PID가 부모 프로세스 실행 스레드에 반환되고, 자식 프로세스 실행 스레드에는 0이 반환됩니다. 실패하면 상위 프로세스 컨텍스트에 -1이 반환되고 하위 프로세스가 생성되지 않으며 PHP 오류가 발생합니다.
fork의 하위 프로세스 상태를 기다리거나 반환합니다. 대기 기능은 하위 프로세스가 종료되거나 현재 프로세스를 중단하거나 신호 처리 기능을 호출해야 하는 신호를 받을 때까지 현재 프로세스의 실행을 스크레이핑합니다. 이 함수가 호출될 때 자식 프로세스가 종료된 경우(일반적으로 좀비 프로세스라고 함) 이 함수는 즉시 반환됩니다. 하위 프로세스에서 사용하는 모든 시스템 리소스가 해제됩니다.
1. 좀비 프로세스 및 고아 프로세스 문제
일부 좀비 프로세스는 pcntl_wait에 의해 획득되고 인계되지 않은 프로세스는 주 프로세스가 종료된 후 고아 프로세스가 됩니다. 고아 프로세스는 대기의 상태 획득 및 리소스 해제를 완료하기 위해 init 프로세스에 의해 채택됩니다.
위 내용은 이 글의 전체 내용입니다. 모든 분들의 학습에 도움이 되었으면 좋겠습니다. 더 많은 관련 내용은 PHP 중국어 홈페이지를 주목해주세요!
관련 권장 사항:
Laravel5.5 테이블 마이그레이션 명령 실행 시 테이블이 비어 있는 문제에 대한 솔루션
scope, global, static 등과 같은 키워드. PHP 변수
위 내용은 PHP 다중 프로세스 실행 작업에 대한 지침의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!