>백엔드 개발 >PHP 문제 >pcntl 모듈을 활성화하고 PHP에서 다중 프로세스 프로그래밍을 구현하는 방법은 무엇입니까?

pcntl 모듈을 활성화하고 PHP에서 다중 프로세스 프로그래밍을 구현하는 방법은 무엇입니까?

王林
王林앞으로
2019-08-29 14:38:384606검색

먼저 내가 설치한 PHP 버전을 확인하세요:

PHP 7.3.7 (cli) (built: Jul 12 2019 22:25:55) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.7, Copyright (c) 1998-2018 Zend Technologies

PHP에서 멀티 프로세스를 구현하려면 pcntl 모듈을 설치해야 합니다. 이 모듈은 PHP에서 공식적으로 제공하는 모듈이므로 PHP 소스 코드에서 찾을 수 있습니다. php7.3.7 소스 코드를 다운로드하고 /home 디렉터리에 압축을 푼 다음 필요한 확장자 pcntl은 /home/php-7.3.7/ext/pcntl에 있습니다. /home/php-7.3.7/ext/pcntl 

依次执行以下命令

phpize
./configure --with-php-config=/usr/local/bin/php-config
make & make install

这里面确定 php-config 文件的路径可以使用   find / -name php-config   最后生成 pcntl.so 文件。

然后找到 php的ini文件所在路径 可以使用   php --ini   命令查看

至于php的扩展模块路径可以使用  php -i | grep extension_dir   查看,然后将生成的so文件拷到模块路径下并且将  extension=pcntl  加到php.ini文件中

使用 php -m 查看模块是否被加载!到这里pcntl 模块就安装好啦,下面开始编码

for ($i = 0; $i < 3; $i++){   
    $pid = pcntl_fork();
     if ($pid == -1) {
        die("开启进程失败");
    } elseif ($pid) { 
         echo "启动子进程 $pid \n";
    } else {
      echo "子进程 ".getmypid()." 正在处理任务\n";
      sleep(rand(5,10));
      exit;
    }
}

while (pcntl_waitpid(0, $status) != -1) {
    $status = pcntl_wexitstatus($status);    
    echo "子进程推出,状态码 $status \n";
}

pcntl_fork()函数创建一个子进程,成功时,在父进程执行线程内返回产生的子进程的PID,在子进程执行线程内返回0。失败时,在 父进程上下文返回-1,不会创建子进程,并且会引发一个PHP错误。

pcntl_waitpid()

다음 명령을 실행하세요. 순서:

root@4226aaf8d937:/home/demo# php index.php 
启动子进程 150 
启动子进程 151 
启动子进程 152 
子进程 152 正在处理任务
子进程 151 正在处理任务
子进程 150 正在处理任务
子进程推出,状态码 0 
子进程推出,状态码 0 
子进程推出,状态码 0

여기에서 확인하세요 php-config 파일의 경로는 find / -name php-config를 사용하여 최종적으로 pcntl.so를 생성할 수 있습니다 파일.

그런 다음 php의 ini 파일이 있는 경로를 찾아 php --ini 명령을 사용하여 확인할 수 있습니다.

php의 확장 모듈 경로는 이를 사용하면 됩니다. php -i | grep Extension_dir 생성된 so 파일을 모듈 경로에 복사하고 php.ini 파일에 extension=pcntl을 추가하세요.

php 사용 - m 모듈이 로드되었는지 확인하세요! 이제 pcntl 모듈이 설치되었습니다. 이제 코딩을 시작하겠습니다

root@4226aaf8d937:/# ps -aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.3   3976  3180 pts/0    Ss   04:42   0:00 bash
root        17  0.0  0.3   3868  3184 pts/1    Ss   04:48   0:00 bash
root       149  0.3  2.1  79740 21888 pts/0    S+   06:18   0:00 php index.php
root       150  0.0  0.6  79740  6664 pts/0    S+   06:18   0:00 php index.php
root       151  0.0  0.6  79740  6604 pts/0    S+   06:18   0:00 php index.php
root       152  0.0  0.6  79740  6604 pts/0    S+   06:18   0:00 php index.php
root       153  0.0  0.2   7640  2660 pts/1    R+   06:18   0:00 ps -aux

pcntl_fork() 함수가 성공하면 생성된 하위 프로세스의 PID가 실행 스레드에 반환됩니다. 상위 프로세스는 프로세스 실행 스레드 내에서 0을 반환합니다. 실패하면 상위 프로세스 컨텍스트에 -1이 반환되고 하위 프로세스가 생성되지 않으며 PHP 오류가 발생합니다.

pcntl_waitpid() — 포크의 하위 프로세스 상태를 기다리거나 반환하거나, 매개변수 pid로 지정된 프로세스 번호를 가진 프로세스가 종료될 때까지 현재 프로세스의 실행을 일시 중지하거나, 요청하는 신호를 수신합니다. 현재 프로세스를 중단하거나 신호 처리 기능을 호출합니다. 반환된 값은 -1, 0 또는 >0일 수 있습니다. -1이면 하위 프로세스에 오류가 있음을 의미합니다. >0이면 하위 프로세스가 종료되었으며 값은 종료된 프로세스의 pid입니다. 자식 프로세스를 종료하는 방법은 $status 상태 코드 응답을 전달할 수 있습니다

<?php
$pid_arr = [];
for ($i = 0; $i < 3; $i++){   
    $pid = pcntl_fork();
     if ($pid == -1) {
        die("开启进程失败");
    } elseif ($pid) { 
         echo "启动子进程 $pid \n";
         array_push($pid_arr, $pid);
    } else {
      echo "子进程 ".getmypid()." 正在处理任务\n";
      sleep(rand(5,10));
      exit;
    }
}

for ($i=0; $i < count($pid_arr); $i++) {
    while (pcntl_waitpid($pid_arr[$i], $status) != -1) {
        if(!pcntl_wifexited($status)){
            //进程非正常退出
            if(pcntl_wifsignaled($status)){
                $signal = pcntl_wtermsig($status);
                //不是通过接受信号中断
                echo "子进程 $pid_arr[$i] 属于非正常停止,接收到信号 $signal \n";
            }else{
                print_r("子进程 $pid_arr[$i] 完成任务并退出 \n");
            }

        }else{
            //获取进程终端的退出状态码;
            $code = pcntl_wexitstatus($status);
            print_r("子进程 $pid_arr[$i] 正常结束任务并退出,状态码 $status \n ");
        }
    }
}
rrreee

kill -9 프로세스 ID를 사용하여 자식 프로세스가 강제 종료되는 경우 어떻게 처리하나요?

rrreee

pcntl 모듈을 활성화하고 PHP에서 다중 프로세스 프로그래밍을 구현하는 방법은 무엇입니까?pcntl_wifexited

— 상태 코드가 정상적인 종료를 나타내는지 확인합니다.

pcntl 모듈을 활성화하고 PHP에서 다중 프로세스 프로그래밍을 구현하는 방법은 무엇입니까?

pcntl_wifsignaled

— 하위 프로세스 상태 코드가 신호로 인한 중단을 나타내는지 확인합니다.

pcntl_wtermsig 🎜 — 하위 프로세스를 발생시킨 신호를 반환합니다. 🎜 🎜두 창 중 하나를 엽니다: 🎜🎜🎜🎜🎜🎜🎜🎜🎜더 많은 관련 콘텐츠를 보려면 PHP 중국어 웹사이트를 방문하세요: 🎜PHP 비디오 튜토리얼🎜🎜

위 내용은 pcntl 모듈을 활성화하고 PHP에서 다중 프로세스 프로그래밍을 구현하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 cnblogs.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제