这么实现多进程 脚本有问题不?

guanhui07

问题描述

umask(0);
        for ($i = 1; $i <= $processNum; $i++) {
            $pid = pcntl_fork();
            if ($pid > 0) {    // 在父进程中
                cli_set_process_title($className);
                pcntl_waitpid($pid, $status, WNOHANG);
                // 给父进程安装一个SIGCHLD信号处理器
                pcntl_signal(SIGCHLD, static function () use ($pid) {
                    pcntl_waitpid($pid, $status, WNOHANG);
                });
                // 父进程不断while循环,去反复执行pcntl_waitpid(),从而试图解决已经退出的子进程
                while (true) {
                    pcntl_signal_dispatch();
                }
            } elseif (0 === $pid) {
               while (true) {
                    echo 'process ts1 ' . Carbon::now()->toDateTimeString().PHP_EOL;
                    sleep(1);
                }
            }
        }

为此你搜索到了哪些方案及不适用的原因

目前我是这么实现的

495 1 0
1个回答

admin
     pcntl_waitpid($pid, $status, WNOHANG);
                // 给父进程安装一个SIGCHLD信号处理器

1: 这里为什么要处理回收子进程呢,不是在下面已经while(1){pcntl_signal_dispatch(); }了吗

//这里出现报错
echo 'process ts1 ' . Carbon::now()->toDateTimeString().PHP_EOL;

2: 目前看来只要子进程的数量会随着报错而减少,我觉得应该在pcntl_signal信号注册中判断下子进程数量,新开维持或者当子进程全部退光,主进程就关闭

年代过于久远,无法发表回答
🔝