• 技术文章 >后端开发 >php教程

    PHP的pcntl进程控制之多进程消费模型

    不言不言2018-07-06 17:44:51原创574
    这篇文章主要介绍了关于PHP的pcntl进程控制之多进程消费模型,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下

    多进程消费模型

    父进程等待并控制子进程的退出

    思路整理

    父进程开启后,直接获取到子进程的pid,然后存入child数组,子进程fork出来后直接开启业务消费代码,然后exit(0)退出,然后父进程pcntl_wait等待子进程退出,全部退出后父进程结束

    代码

    const NEWLINE = "\n\n";
    
    if (strtolower(php_sapi_name()) != 'cli') {
        die("请在cli模式下运行");
    }
    
    $bizPath = "./childBiz/";
    
    if (!is_dir($bizPath)) {
        @mkdir($bizPath, 0755, true);
    }
    
    $child = [];
    
    $index = 0;
    $loop = 10; //子进程的数量
    
    //如果是资源类型的变量,父子进程会共享
    //$f = fopen("./pcntl_fork_2.php", "r");
    
    while ($index < $loop) {
    
        echo "当前进程:" . getmypid() . NEWLINE;
    
        $pid = pcntl_fork(); //fork出子进程
    
        //fork后父进程会走自己的逻辑,子进程从处开始走自己的逻辑,堆栈信息会完全复制给子进程内存空间,父子进程相互独立
    
        if ($pid == -1) { // 创建错误,返回-1
    
            die('进程fork失败');
    
        } else if ($pid) { // $pid > 0, 如果fork成功,返回子进程id
    
            //获取创建的子进程
            $child[$pid] = $pid;
            echo "{$pid} child create!" . microtime(true) . NEWLINE;
    
        } else { // $pid = 0
    
            // 子进程逻辑
            $sleepTime = rand(5, 18);
            sleep($sleepTime);
            $time = microtime(true);
            file_put_contents($bizPath.getmypid().".log", $time . ":" . $index . PHP_EOL, FILE_APPEND);
            exit(0);
        }
        $index++;
    }
    
    while (count($child)) {
        //阻塞等待
        $pid = pcntl_wait($status);
        $time = microtime(true);
        file_put_contents("./father.log", $time . ":" . $pid . ":" . $status . PHP_EOL, FILE_APPEND);
        if ($pid > 0) {
            unset($child[$pid]);
        }
        if ($pid == -1) {
            unset($child);
        }
    //    foreach ($child as $k => $pid) {
    //        //不阻塞循环判断 WNOHANG表示如果没有子进程退出立刻返回
    //        $res = pcntl_waitpid($pid, $status, WNOHANG);
    //        $time = microtime(true);
    //        file_put_contents("./father.log", $time . ":" . $pid . ":" . $res . ":" . $status . PHP_EOL, FILE_APPEND);
    //        if (-1 == $res || $res > 0) {
    //            unset($child[$k]);
    //        }
    //    }
    }
    
    //fclose($f);
    //主进程退出
    exit(0);

    以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!

    相关推荐:

    PHP的pcntl进程控制之pcntl_wait

    PHP的pcntl进程控制之pcntl_fork

    以上就是PHP的pcntl进程控制之多进程消费模型的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:php pcntl 多进程
    上一篇:PHP实现的简单四则运算计算器功能示例讲解 下一篇:PHP使用自定义key实现对数据加密解密的方法讲解
    千万级数据并发解决方案

    相关文章推荐

    • 100道常见PHP面试题(附解析),增强你的知识储备!• 深入浅析PHP文件包含漏洞• PHP+TEXT留言本(三)_PHP教程• PHP 中使用 Smarty 之六:Smarty 内建函数_PHP教程• 详解PHP数组排序_PHP教程
    1/1

    PHP中文网