PHP多进程编程「建议收藏」

PHP多进程编程

大家好,又见面了,我是全栈君。

点击上方“码农编程进阶笔记”,选择“置顶或者星标

优质文章第一时间送达!

           PHP是单进程执行的,PHP处理多并发主要是依赖服务器或PHP-FPM的多进程及它们进程的复用,但PHP实现多进程也意义重大,尤其是在后台Cli模式下处理大量数据或运行后台DEMON守护进程时,多进程的优势不用多说。

 使用多进程的优点:

    1. 使用多进程, 子进程结束以后, 内核会负责回收资源
    2. 使用多进程,子进程异常退出不会导致整个进程Thread退出. 父进程还有机会重建流程.
    3. 一个常驻主进程, 只负责任务分发, 逻辑更清楚.

PHP中实现多进程,Let’s Go.

 

我们需要安装pcnt扩展

pcntl是process control的缩写,通常,php会默认安装这个扩展。使用phpinfo()函数查看扩展是否存在。

PHP多进程编程「建议收藏」

 

使用pcntl_fork() 函数创建子进程

pcntl_fork作用就是创建和当前进程一样的子进程,这个子进程代码段和当前进程一模一样,但是拥有自己的数据段。看一个最简单的创建子进程的方法:

<?php/** * @date 2019-04-03 */// 获取父进程id$parentPid = getmypid(); // 创建子进程$childPid = pcntl_fork();switch($childPid) {
  
      case -1:        print "创建子进程失败!".PHP_EOL;        exit;    case 0:        print "我是子进程,进程ID:{$childPid}".PHP_EOL;        break;    default:        print "我是父进程,进程ID:{$parentPid},子进程ID: {$childPid}".PHP_EOL;}?>
 

pcntl_fork()调用成功以后,一个程序变成了两个程序:一个程序得到的$pid变量值是0,它是子进程;另一个程序得到的$pid的值大于0,这个值是子进程的PID,它是父进程。

输出结果:

PHP多进程编程「建议收藏」

 


 

子进程回收

 

① 阻塞方式
        刚刚有ps么?一般我习惯用ps aux加上grep命令来查找运行着的后台进程。其中有一列STAT,标识了每个进程的运行状态。这里,我们关注状态Z:僵尸(Zombie)。当子进程比父进程先退出,而父进程没对其做任何处理的时候,子进程将会变成僵尸进程。僵尸进程虽然不占什么内存,但是很碍眼。(别忘了它们还占用着PID)

一般来说,在父进程结束之前回收挂掉的子进程就可以了。在pcntl扩展里面有一个pcntl_wait()函数,通过这个方法等待进程结束,然后回收已经结束的进程。

<?php/** * @date 2019-04-03 */$parentPid = getmypid(); // 获取父进程id$childPid = pcntl_fork(); // 创建子进程switch($childPid) {
  
      case -1:        print "创建子进程失败!".PHP_EOL;        exit;    case 0:        print "我是子进程,进程ID:{$childPid}".PHP_EOL;        break;    default:        pcntl_wait($status); // 子进程执行完后才执行父进程        print "我是父进程,进程ID:{$parentPid},子进程ID: {$childPid}".PHP_EOL;}
 

② 非阻塞方式
     阻塞方式失去了多进程的并行性。还有一种方法,既可以回收已经结束的子进程,又可以并行。这就是非阻塞的方式。

<?php/** * @date 2019-04-03 */for ($i = 1; $i <= 5; ++$i) {
  
      $pid = pcntl_fork(); // 创建子进程    if (!$pid) {
  
          sleep(1);        print "In child $i\n";        exit($i);    }}// pcntl_waitpid 第一个参数为 0 代表处理全部子进程while (pcntl_waitpid(0, $status) != -1) {
  
      $status = pcntl_wexitstatus($status);    echo "Child $status completed\n";}

如果父进程先挂了怎么办?

 

会发生什么?什么也不会发生,子进程依旧还在运行。但是这个时候,子进程会被交给1号进程,1号进程成为了这些子进程的继父。1号进程会很好地处理这些进程的资源,当它们结束时1号进程会自动回收资源。所以,另一种处理僵尸进程的临时办法是关闭它们的父进程。

 

最后需要注意的:

进程控制不能被应用在Web服务器环境,当其被用于Web服务环境时可能会带来意外的结果。– 摘自PHP手册

 

参考:

http://www.hackingwithphp.com/16/1/3/getting-into-multiprocessing

http://www.jb51.net/article/71232.htm

http://www.laruence.com/2009/06/11/930.html

http://imhuchao.com/596.html

https://www.pureweber.com/article/php-multi-process-programming-preview/

PHP多进程编程「建议收藏」

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/112019.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 11种经典滤波算法「建议收藏」

    11种经典滤波算法「建议收藏」1、限幅滤波法(又称程序判断滤波法)  A、方法:      根据经验判断,确定两次采样允许的最大偏差值(设为A)      每次检测到新值时判断:      如果本次值与上次值之差&lt;=A,则本次值有效      如果本次值与上次值之差&gt;A,则本次值无效,放弃本次值,用上次值代替本次值  B、优点:      能有效克服因偶然因素引起的脉冲干扰…

    2022年5月3日
    66
  • awk 数组学习

    awk 数组学习awk是Linux一个必不可少的文本处理工具,其编程简单,功能强大。其中awk处理文本的几块比较常用:1、行分隔;2、正则表达式匹配;3、字符串处理;4、awk数组。接下来主要介绍一下awk数组的相关内容。awk数组特点:(1)、是一种关联数组(AssociativeArrays),下表可以是数字也可以是字符串,(2)、数组名和元素无需提前声明,(3)、无需指定数…

    2022年7月19日
    13
  • R、Rstudio详细安装教程(详细图文)[通俗易懂]

    R、Rstudio详细安装教程(详细图文)[通俗易懂]R、Rstudio详细安装教程(详细图文)1、R下载及其安装下载安装2、Rstudio下载及安装下载安装测试1、R下载及其安装下载1、网址:https://cran.r-project.org/mirrors.html2、选择镜像3、选择系统4、选择base5、点击下载安装1、安装2、下一步3、选择安装路径4、下一步5、下一步6、继续下一步7、安装完成。2、Rstudio下载及安装下载1、下载地址:https://rstudio.com/produc

    2022年6月22日
    43
  • Ubuntu18.04安装 NVIDIA驱动+CUDA10.2+cuDNN+TensorRT

    Ubuntu18.04安装 NVIDIA驱动+CUDA10.2+cuDNN+TensorRT1.先卸载原有n卡驱动#forthedriverinstalledbyapt-get:sudoapt-getremove–purgenvidia*#forthedriverinstalledbyrunfilesudochmod+x*.runsudo./NVIDIA-Linux-x86_64-384.59.run–uninstall如果使用的是apt-

    2022年5月4日
    192
  • Zynq-Linux移植学习笔记之一-入门[通俗易懂]

    Zynq-Linux移植学习笔记之一-入门[通俗易懂]1、相关网站zynqlinux软件网站:www.wiki.xilinx.comzynqu-bootgithub地址:https://github.com/xilinx 2、启动过程3、u-boot配置3.1下载u-bootUBOOT有多个版本,可以去网站上下载相应的版本。14.5及早期的版本对Micron的QSPIFlash芯片支持不完整。建议下载后期

    2022年9月2日
    3
  • Android Q 电量使用图分析 show app usage「建议收藏」

    Android Q 电量使用图分析 show app usage「建议收藏」这个界面就是packages/apps/Settings/src/com/android/settings/fuelgauge/PowerUsageAdcanced.java,然后查看它加载的布局文件@OverrideprotectedintgetPreferenceScreenResId(){returnR.xml.power_usage_advanced;}布局代码如下<PreferenceScreenxmlns…

    2025年7月8日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号