먼저 내가 설치한 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 -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 오류가 발생합니다. <?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를 사용하여 자식 프로세스가 강제 종료되는 경우 어떻게 처리하나요?
pcntl_wifexited
— 상태 코드가 정상적인 종료를 나타내는지 확인합니다. pcntl_wifsignaled— 하위 프로세스 상태 코드가 신호로 인한 중단을 나타내는지 확인합니다.
pcntl_wtermsig 🎜 — 하위 프로세스를 발생시킨 신호를 반환합니다. 🎜 🎜두 창 중 하나를 엽니다: 🎜🎜🎜🎜🎜🎜🎜🎜🎜더 많은 관련 콘텐츠를 보려면 PHP 중국어 웹사이트를 방문하세요: 🎜PHP 비디오 튜토리얼🎜🎜위 내용은 pcntl 모듈을 활성화하고 PHP에서 다중 프로세스 프로그래밍을 구현하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!