• 技术文章 >后端开发 >PHP问题

    php pcntl_fork 进程不死掉怎么办

    藏色散人藏色散人2022-10-25 09:14:54原创153

    php pcntl_fork进程不死掉的解决办法:1、打开相应的PHP代码文件;2、查看php多线程处理代码;3、通过“public function installSignal(){pcntl_signal(SIGTERM, [$this, 'sigHandle'])...};”方式安装信号处理器即可。

    php入门到就业线上直播课:进入学习

    本教程操作环境:windows7系统、PHP8.1版、Dell G3电脑。

    php pcntl_fork 进程不死掉怎么办?

    问题描述

    第一次使用php多线程处理任务引起僵尸进程问题,原因是子进程没有发送结束信号,父进程没有等待子进程的结束

    理解

    $result = pcntl_waitpid($pid_, $status, WNOHANG);
     
    $result等于-1时代表子进程结束
    public function run()
        {
            $this->installSignal();
            // 获取当前pid   getmypid()
            $current_pid = posix_getpid();
            // dump('当前pid:'.$current_pid);
            cli_set_process_title('设置process_title');
            $pids = [];
            for($i = 0; $i < $this->forks; $i ++){
                $pid = pcntl_fork();
                if($pid == -1){
                    die('进程开启失败');
                }else if($pid){
                    // 父进程得到子进程pid
                    dump('父进程');
                    dump('父进程得到子进程pid'.$pid);
                    $pids[] = $pid;
                }else{
                    dump('子进程');
                    dump('父进程pid-'.posix_getppid());
                    // 子进程
                    dump("第{$i}个进程");
                    sleep(10);
                    dump("第{$i}个进程:等待10s");
                    // 发送结束信号
                    // exit(-1);
                    // posix_kill(getmypid(), SIGKILL);
                    posix_kill(getmypid(), SIGHUP);
                }
            }
            // 父进程等待子进程执行结束
            while($pids){
                foreach($pids as $k => $pid_){
                    dump('父进程不阻塞-等待子进程结束');
                    $result = pcntl_waitpid($pid_, $status, WNOHANG);
                    dump($result);
                    if($result === -1){
                  dump('子进程返回状态'.$status);
           unset($pids[$k]);
                    }
            }
        }
        /**
         * 信号处理器
         */
        public function sigHandle($signo)
        {
            switch ($signo) {
                case SIGTERM:
                    // 处理SIGTERM信号
                    dump('处理SIGTERM信号');
                    exit;
                    break;
                case SIGHUP:
                        //处理SIGHUP信号
                    dump('处理SIGHUP信号');
                    exit(SIGHUP);
                    break;
                case SIGUSR1:
                    dump('处理SIGUSR1信号');
                    break;
                default:
                    // 处理所有其他信号
            }
        }
        /**
         * 安装信号处理器
         *
         */
        public function installSignal()
        {
            pcntl_signal(SIGTERM, [$this, 'sigHandle']);
            pcntl_signal(SIGHUP, [$this,'sigHandle']);
            pcntl_signal(SIGUSR1, [$this,'sigHandle']);
        }

    推荐学习:《PHP视频教程

    以上就是php pcntl_fork 进程不死掉怎么办的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。

    前端(VUE)零基础到就业课程:点击学习

    清晰的学习路线+老师随时辅导答疑

    自己动手写 PHP MVC 框架:点击学习

    快速了解MVC架构、了解框架底层运行原理

    专题推荐:pcntl_fork php
    上一篇:php怎么查询星座运势 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • ❤️‍🔥共22门课程,总价3725元,会员免费学• ❤️‍🔥接口自动化测试不想写代码?• php pcntl_signal没有效果怎么办• PHP异步进程助手(async-helper)• centos进程杀不死怎么办• 父进程和子进程可以并发执行吗?
    1/1

    PHP中文网