获取子进程pid_PHP多进程之pcntl扩展的使用

77b0142dda6b3e089c8e0f7a321c79b9.png

PHP实现多进程的模块是pcntl,而且只有在linux下才使用这个拓展,不过现在服务器都基本使用linux,我们还是可以用起来的。

安装

可以直接使用pecl install pcntl,或者去https://pecl.php.net/下载源码包手动编译安装。

使用

先举个官方的栗子:

<?php

$pid = pcntl_fork();
//父进程和子进程都会执行下面代码
if ($pid == -1) {
    //错误处理:创建子进程失败时返回-1.
     die('could not fork');
} else if ($pid) {
     //父进程会得到子进程号,所以这里是父进程执行的逻辑
     pcntl_wait($status); //等待子进程中断,防止子进程成为僵尸进程。
} else {
     //子进程得到的$pid为0, 所以这里是子进程执行的逻辑。
}

使用到的函数:

  • pcntl_fork在当前进程当前位置产生分支(子进程)。fork是创建了一个子进程,父进程和子进程 都从fork的位置开始向下继续执行,不同的是父进程执行过程中,得到的fork返回值为子进程 号,而子进程得到的是0。
  • pcntl_wait 等待或返回fork的子进程状态。这个函数会挂起当前进程的执行直到一个子进程退出或接收到一个信号要求中断当前进程或调用一个信号处理函数。如果一个子进程在调用此函数时已经退出(俗称僵尸进程),此函数立刻返回。子进程使用的所有系统资源将被释放。

再来个经典栗子:

<?php
$children = []; //定义一个数组用来存储子进程的pid
$m = 10;    //fork 10次
for ($x = 0; $x < $m; $x++) {
    $pid = pcntl_fork();
    if ($pid == -1) {
        die('could not fork '.$x);
    } else if ($pid) {    //父进程执行的代码块
        $children[] = $pid;
        printf("Parent get child %d 's pid: %dn", $x, $pid);
    } else {    //子进程执行的代码块
        $my_pid = posix_getpid();    //子进程获取自己的pid
        //子进程得到的$pid为0, 所以这里是子进程执行的逻辑。
        echo "Child $my_pid running...n";
        sleep(10);        //子进程干点啥 这里是睡10秒
        
        echo "...Child $my_pid donen";
        exit(0);        //子进程执行结束exit
    }
}

while(count($children) > 0) {
    foreach($children as $key => $pid) {
        $res = pcntl_waitpid($pid, $status, WNOHANG);    //获取返回指定pid的返回状态加了第二个参数非阻塞
        if($res == -1 || $res > 0){
            echo "Parent get child $pid 's status: $statusn";
            unset($children[$key]);
        }
    }
    sleep(1);        //每一秒去轮询没有退出的子进程状态
}

原文连接:

https://www.ioio.pw/php/2019/01/02/php-pcntl.html​www.ioio.pw
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值