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

我试着参考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

执行后进程情况:
image.png

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

补充

我在本地虚拟机中切换了不同的php版本,发现php7.0、php7.1是可以的。php7.2、php7.3都是不可以的。 这是由于缺少配置么?或者是我装了啥扩展?
php7.1
image.png

php7.2
image.png

php7.3
image.png

阅读 2.1k
2 个回答
✓ 已被采纳新手上路,请多包涵

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

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

兼容pcntl_fork()与grpc的方法

php.ini中增加配置:

[grpc]
grpc.enable_fork_support = 1

测试符合预期。
Docker 镜像 php:7.2.34:

image.png

本地 8.1.2:

image.png

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏