>  기사  >  백엔드 개발  >  PHP 다중 프로세스 실행 작업에 대한 지침

PHP 다중 프로세스 실행 작업에 대한 지침

不言
不言원래의
2018-07-06 11:21:302287검색

이 글은 주로 PHP 다중 프로세스 실행 작업에 대한 지침을 소개합니다. 이제 특정 참조 값을 공유합니다. 필요한 친구가 참조할 수 있습니다.

Requirements

지정된 수의 여러 작업을 동시에 실행합니다. 프로세스 수 제어

프로세스 및 스레드:

프로세스는 서로 독립적이며 서로 영향을 미치지 않습니다.

코드 예:

<?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

실행 분석:

  1. pcntl_fork가 하위 프로세스를 생성한 후 하위 프로세스는 함수 코드를 실행하고 상위 프로세스는 계속해서 작업 ID를 증가시키고 다음 프로세스를 생성합니다.

  2. pcntl_wait를 사용하여 하위 프로세스의 실행이 완료되고 종료될 때까지 기다린 다음 새 프로세스를 생성하여 총 프로세스 수를 제어합니다.

  3. 주 프로세스 생성이 완료된 후 다음을 통해 루프를 종료합니다. 부서지다. 현재 실행 중인 하위 프로세스가 있을 수 있습니다.

관련 함수:

pcntl_fork

현재 프로세스의 현재 위치에 브랜치(자식 프로세스)를 생성합니다. 성공하면 생성된 자식 프로세스의 PID가 부모 프로세스 실행 스레드에 반환되고, 자식 프로세스 실행 스레드에는 0이 반환됩니다. 실패하면 상위 프로세스 컨텍스트에 -1이 반환되고 하위 프로세스가 생성되지 않으며 PHP 오류가 발생합니다.

pcntl_wait

fork의 하위 프로세스 상태를 기다리거나 반환합니다. 대기 기능은 하위 프로세스가 종료되거나 현재 프로세스를 중단하거나 신호 처리 기능을 호출해야 하는 신호를 받을 때까지 현재 프로세스의 실행을 스크레이핑합니다. 이 함수가 호출될 때 자식 프로세스가 종료된 경우(일반적으로 좀비 프로세스라고 함) 이 함수는 즉시 반환됩니다. 하위 프로세스에서 사용하는 모든 시스템 리소스가 해제됩니다.

기타:

1. 좀비 프로세스 및 고아 프로세스 문제

일부 좀비 프로세스는 pcntl_wait에 의해 획득되고 인계되지 않은 프로세스는 주 프로세스가 종료된 후 고아 프로세스가 됩니다. 고아 프로세스는 대기의 상태 획득 및 리소스 해제를 완료하기 위해 init 프로세스에 의해 채택됩니다.

위 내용은 이 글의 전체 내용입니다. 모든 분들의 학습에 도움이 되었으면 좋겠습니다. 더 많은 관련 내용은 PHP 중국어 홈페이지를 주목해주세요!

관련 권장 사항:

php 빠른 정렬 코드

Laravel5.5 테이블 마이그레이션 명령 실행 시 테이블이 비어 있는 문제에 대한 솔루션

scope, global, static 등과 같은 키워드. PHP 변수

위 내용은 PHP 다중 프로세스 실행 작업에 대한 지침의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.