后端开发|PHP问题
多进程
后端开发-PHP问题
先查看下我安装的PHP版本:
免费收银平台源码,怎么打开vscode的提示,ubuntu设置硬盘,管理多个tomcat工具,影视爬虫网站,php移动的图片上传,如何通过媒体做seo优化,最新土巴兔网站源码,html5模板 调取模板头部lzw
PHP 7.3.7 (cli) (built: Jul 12 22:25:55) ( NTS )Copyright (c) 1997- The PHP GroupZend Engine v3.3.7, Copyright (c) 1998- Zend Technologies
php实现多进程需要安装pcntl模块,这个模块是php官方提供的,所以我们可以在PHP源码中找到,下载 php7.3.7 源码并解压到 /home 目录下,这时我们需要的扩展 pcntl 在/home/php-7.3.7/ext/pcntl
mvc5源码,ubuntu如何使用汉语,怎样下载tomcat8,scrapy爬虫分析,细说php光盘下载,质量好关键词seo排名优化费用lzw
依次执行以下命令:
彩票站源码 采集规则,vscode怎么使用c,ubuntu eth0,ca证书 tomcat,sqlite 获取表头尾元素,日系网页设计,asp搭配什么数据库,服务器怎么禁ping,bootstrap选项卡插件,前端ui框架 兼容性,python爬虫excel,php扩展下载,超链接seo,springboot高端操作,dedecms 标签 图片,代购网站源码,弹出层载入网页,个性网站模板,dedecms 后台更改菜单后如何在前台显示并保存,js实现页面右侧的分享,超市收银管理系统代码,幸运大转盘程序lzw
phpize./configure --with-php-config=/usr/local/bin/php-configmake & 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()
— 等待或返回fork的子进程状态,挂起当前进程的执行直到参数pid指定的进程号的进程退出, 或接收到一个信号要求中断当前进程或调用一个信号处理函数。返回的值可以是-1,0或者 >0的值, 如果是-1, 表示子进程出错, 如果>0表示子进程已经退出且值是退出的子进程pid,至于如何退出, 可以通过$status状态码反应
root@4226aaf8d937:/home/demo# php index.php 启动子进程 150 启动子进程 151 启动子进程 152 子进程 152 正在处理任务子进程 151 正在处理任务子进程 150 正在处理任务子进程推出,状态码 0 子进程推出,状态码 0 子进程推出,状态码 0
root@4226aaf8d937:/# ps -auxUSER PID %CPU %MEM VSZ RSS TTYSTAT START TIME COMMANDroot 1 0.0 0.3 3976 3180 pts/0 Ss 04:42 0:00 bashroot 17 0.0 0.3 3868 3184 pts/1 Ss 04:48 0:00 bashroot 149 0.3 2.1 79740 21888 pts/0 S+ 06:18 0:00 php index.phproot 150 0.0 0.6 79740 6664 pts/0 S+ 06:18 0:00 php index.phproot 151 0.0 0.6 79740 6604 pts/0 S+ 06:18 0:00 php index.phproot 152 0.0 0.6 79740 6604 pts/0 S+ 06:18 0:00 php index.phproot 153 0.0 0.2 7640 2660 pts/1 R+ 06:18 0:00 ps -aux
当子进程被使用 kill -9 进程id 强制杀死的时候如何处理?
<?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 "); } }}
pcntl_wifexited— 检查状态代码是否代表一个正常的退出
pcntl_wifsignaled — 检查子进程状态码是否代表由于某个信号而中断
pcntl_wtermsig — 返回导致子进程中断的信号
我们打开两个窗口 其中之一:
想了解更多相关内容请访问PHP中文网:PHP视频教学