安装

1.编译php源码时加入

--enable-pcntl

2.在现有的环境下新增加扩展

cd php-version/ext/pcntl
phpize
./configure && make && make install
echo "extension=pcntl.so" >> /etc/php.ini  

3.Mac下用brew安装 例如我本地是php7.1.5

brew install php71-pcntl 

使用

header('content-type:text/html;charset=utf-8' );  // 必须加载扩展
if (!function_exists("pcntl_fork")) {  die("pcntl extention is must !");
}
pcntl_signal(SIGCHLD, SIG_IGN); //如果父进程不关心子进程什么时候结束,子进程结束后,内核会回收。
$pid_dir = __dir__."/pid_files";
for($i=0; $i<3; $i++){$pid = pcntl_fork(); //创建子进程 if($pid == -1){//错误处理:创建子进程失败时返回-1.var_dump("fork failed");}if(!$pid){//子进程得到的$pid为0, 所以这里是子进程执行的逻辑。  //子进程代码$pid = posix_getpid();$ppid = posix_getppid();$r = rand(0,100);  //随机数touch("$pid_dir/fork_child_process_{$i}_{$ppid}_{$pid}_{$r}");exit;}else{//父进程会得到子进程号,所以这里是父进程执行的逻辑  //如果不需要阻塞进程,而又想得到子进程的退出状态,则可以注释掉pcntl_wait($status)语句,或写成:  pcntl_wait($status,WNOHANG); //等待子进程中断,防止子进程成为僵尸进程。}
}
$pid = posix_getpid();
$ppid = posix_getppid();
$r = rand(0,100); //随机数
touch("$pid_dir/fork_process_pid_{$ppid}_{$pid}_$r");

相关参数

pcntl_waitpid

等待或返回fork的子进程状态。
多进程的主进程创建了子进程,那主进程如何确认子进程的状态呢。 假如主进程需要根据子进程的状态做不同的处理呢, 这里的状态包括子进程被kill掉,或变成僵尸进程等。 pcntl_waitpid就可以获取子进程的状态码, 通过这个状态码, 就可知道子进程处于什么状态
他的用法:

int pcntl_waitpid ( int $pid , int &$status [, int $options = 0 ] )

返回的值可以是-1,0或者 >0的值, 如果是-1, 表示子进程出错, 如果>0表示子进程已经退出且值是退出的子进程pid,至于如何退出, 可以通过$status状态码反应。 那什么时候返回0呢, 只有在option 参数为 WNOHANG且子进程正在运行时0, 也就是说当设置了options=WNOHANG时, 如果子进程还没有退出, 此时pcntl_waitpid就会返回0
另外, 如果不设置这个参数为WNOHANG, pcntl_waitpid 就会阻塞运行, 直到子进程退出, 至于option的另外一个值WUNTRACED, 暂未理解, 不表

那么如何根据$status(状态码)判断进程是如何退出呢, 如下(参数都是$status)

pcntl_wifexited

这个函数可以根据$status 判断进程是否正常退出, 何为正常退出, 比如exit

pcntl_wexitstatus

这个函数仅在pcntl_wifexited 返回True(即正常退出)时有效, 且返回子进程退出的返回状态码, 这个返回状态码可以通过exit($s)的参数($s必须为整数时)定义

pcntl_wifsignaled

检查子进程状态码是否代表由于某个信号而中断, 比如是不是我们给他发送了term, int 等信号了

pcntl_wexitstatus

假如是发送信号而导致子进程中断, 那么这个信号是什么信号呢, 这个函数就是获取这个信号的

pcntl_wifstopped

仅当option选项为WUNTRACED时有效, 未理解, 不表

pcntl_wtermsig

同上

综合实例代码:

$res = pcntl_waitpid($pid, $status, WNOHANG);
//FileLog::log("pid is $pid; wait result is $res");
if($res == -1 || $res > 0){if(!pcntl_wifexited($status)){//进程非正常退出FileLog::log("service stop unusally; pid is $pid");}else{//获取进程终端的退出状态码;$code = pcntl_wexitstatus($status);FileLog::log("service stop code: $code;pid is $pid ");}if(pcntl_wifsignaled($status)){//不是通过接受信号中断FileLog::log("service stop not by signal;pid is $pid ");}else{$signal = pcntl_wtermsig($status);FileLog::log("service stop by signal $signal;pid is $pid");}
}

上面的这个代码就通过根据pcntl_waitpid的返回结果和状态码对子进程因为不同原因中断做了不同的处理

来源:https://www.lvtao.net/dev/php-pcntl-process.html

PHP多进程之pcntl扩展的使用详解相关推荐

  1. python协程详解_对Python协程之异步同步的区别详解

    一下代码通过协程.多线程.多进程的方式,运行代码展示异步与同步的区别. import gevent import threading import multiprocessing # 这里展示同步和异 ...

  2. python可以处理多大的数据_科多大数据之Python基础教程之Excel处理库openpyxl详解...

    原标题:科多大数据之Python基础教程之Excel处理库openpyxl详解 科多大数据小课堂来啦~Python基础教程之Excel处理库openpyxl详解 openpyxl是一个第三方库,可以处 ...

  3. python源程序文件的扩展名_python程序文件扩展名知识点详解

    python程序文件的扩展名称是什么 python程序的扩展名有.py..pyc..pyo和.pyd..py是源文件,.pyc是源文件编译后的文件,.pyo是源文件优化编译后的文件,.pyd是其他语言 ...

  4. W ndows7怎么进入BlOS,Windows7旗舰版进不了bios界面的详解教程

    最近,一些Win7用户安装了Win7旗舰版之后,发现进入不了bios界面,这个问题该怎么解决呢?有什么方法可以解决这个故障呢?下面,U大侠小编就给大家介绍下Windows7旗舰版进不了bios界面的详 ...

  5. unix环境高级编程之 read与write 函数详解

    学习记录:unix环境高级编程之 read 与write  函数详解 备注:本博文非本人所写,本人觉得此文讲的非常地道通俗易懂,所以摘录在此以方便以后再次查看 read函数从打开的设备或文件中读取数据 ...

  6. python的excell库_扣丁学堂Python基础教程之Excel处理库openpyxl详解

    扣丁学堂Python基础教程之Excel处理库openpyxl详解 2018-05-04 09:49:49 3197浏览 openpyxl是一个第三方库,可以处理xlsx格式的Excel文件.pipi ...

  7. 联盟手游服务器维护中怎么办,移动联盟手游进不去很卡怎么办?移动联盟进不去很卡问题详解[图]...

    类型:角色扮演 大小:1125.85MB 评分:9.9 平台: 移动联盟手游进不去很卡怎么办?下面是友情MT为大家带来的移动联盟手游进不去很卡问题详解,希望能帮助到大家! 移动联盟手游进不去很卡怎么办 ...

  8. PHP扩展代码结构详解

    PHP扩展代码结构详解 : 这个是继: 使用ext_skel和phpize构建php5扩展  内容 (拆分出来) Zend_API:深入_PHP_内核:http://cn2.php.net/manua ...

  9. 王牌竞速安装后显示服务器维护,王牌竞速服务器进不了 服务器登录问题详解...

    不少玩家在游玩游戏的时候,出现王牌竞速服务器进不了的情况,那么我们此时该如何解决呢?下面我们就一起来看一下王牌竞速服务器问题详解吧. 维护更新 王牌竞速如果在维护和更新期间,我们是无法登录服务器进行游 ...

最新文章

  1. 《树莓派学习指南(基于Linux)》——第 2 章 开始探索 2.1 欢迎使用LXDE
  2. Tensorflow实现简单神经网络
  3. java 网络编程 博客园_java网络编程
  4. python expected an indented block什么意思
  5. 前端学习(2043)vue之电商管理系统电商系统之优化web.config.js的配置文件
  6. iPhone 15有望配备潜望式摄像头 供应商已宣布投资建厂
  7. 4月份全球新注册39.2万辆电动汽车 榜首并非Model 3
  8. xadmin实现表单验证
  9. Anaconda, conda, pyenv, virtualenv的区别
  10. oracle错误 无监听程序,oracle_无监听程序_错误
  11. 【AAAI2021】自动跨主题作文属性评分
  12. MCMC算法学习总结
  13. IE离线脱机安装,解决IE11安装时需要“获取更新”
  14. 【滤波器】最小均方(LMS)自适应滤波器
  15. 计算机键盘怎样做除法,电脑键盘除法是哪个键?
  16. win10默认壁纸_Win10系统待机锁频壁纸怎么提取?
  17. 惯性导航(IMU)误差分析
  18. 论述:企业如何做好网络营销推广
  19. 数据库课程设计:图书信息管理系统(Java+MySQL)(附程序)
  20. 计算机软件工程国家标准汇编目录

热门文章

  1. php清空dns缓存文件,dns清空-windows刷新本地DNS缓存的几种方法
  2. 「ImageProcess」mp4视频转存图片内存变大的原因探究
  3. 事件时间/处理时间/进入时间(Event Time / Processing Time / Ingestion Time)
  4. 05_数据的特征处理,归一化,标准化、缺失值处理,以及案例,使用场景,处理办法等
  5. 3线程的终止方式,线程属性,NPTL
  6. Linux 源代码 安装vsftpd 2.3.4
  7. 表的插入、更新、删除、合并操作_18_清空表中记录
  8. arcgis伪节点检查_arcgis建立拓扑分析(检验矢量图)
  9. OpenCV图像翻转:flip()函数的使用
  10. 008 RestFul API 拦截器