pcntl_wait($status)一直获取不到子进程退出状态,造成父进程一直卡住?

作者站长头像
站长
· 阅读数 15

我试着参考workerman的多进程编程思想,手动写一个简单的多进程处理,但是遇到了很奇怪的问题。pcntl_wait()一直等不到子进程退出消息,造成父进程卡住一直不退出。谢谢大佬给指点一下。

php版本:PHP 7.2.34 (cli) (built: Oct 1 2020 13:37:37) ( NTS )

<?php
 //fork一个子进程
$processIds = [];
$i = 0;
$processIds[$i] = pcntl_fork();
switch ($processIds[$i]) {
    case -1:
        echo 'fork failed!';
        exit;
    case 0:
        //子进程处理

        echo "子进程:" . posix_getpid();
        exit;
    default:
        echo "父进程:" . posix_getpid();
        break;
}

// 父进程执行到这里就一直卡住,一直收不到子进程的退出
pcntl_wait($status);
//while (count($processIds) > 0) {
//    // 阻塞等待任意子进程,与pcntl_wait
//    //$myPid = pcntl_waitpid(-1, $status, WNOHANG);
//
//    foreach ($processIds as $key => $pid) {
//        if ($myPid == $pid || $myPid == -1) {
//            unset($processIds[$key]);
//        }
//    }
//}

// 这里始终执行不到
echo "父进程退出";

输出如下

[root@telrobot-test-server-0002 ~]# php demo.php
父进程:14989子进程:14993

执行后进程情况:pcntl_wait($status)一直获取不到子进程退出状态,造成父进程一直卡住?

我找了很多资料,很多方法,这个脚本是没有问题的啊。为什么父进程不能执行完毕。难道是我pcntl扩展有问题,或者是php版本有问题?

补充

我在本地虚拟机中切换了不同的php版本,发现php7.0、php7.1是可以的。php7.2、php7.3都是不可以的。 这是由于缺少配置么?或者是我装了啥扩展?php7.1pcntl_wait($status)一直获取不到子进程退出状态,造成父进程一直卡住?

php7.2pcntl_wait($status)一直获取不到子进程退出状态,造成父进程一直卡住?

php7.3pcntl_wait($status)一直获取不到子进程退出状态,造成父进程一直卡住?

回复
1个回答
avatar
test
2024-07-17

找到问题了,是本地与服务器上php7.2都安装了grpc扩展。 停用grpc扩展,子进程就能正常退出了。

而且安装了grpc扩展以后,每次执行php脚本的时候,都会出现一个主进程+3个子进程,虽然不知道原理,但是目前得出这么个结论。 关闭grpc扩展后,执行php脚本,就会只出现一个进程了.

兼容pcntl_fork()与grpc的方法

php.ini中增加配置:

[grpc]
grpc.enable_fork_support = 1
回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容