我试着参考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扩展有问题,或者是php版本有问题?
补充
我在本地虚拟机中切换了不同的php版本,发现php7.0、php7.1是可以的。php7.2、php7.3都是不可以的。 这是由于缺少配置么?或者是我装了啥扩展?
php7.1
php7.2
php7.3
找到问题了,是本地与服务器上php7.2都安装了
grpc扩展
。停用
grpc扩展
,子进程就能正常退出了。而且安装了
grpc扩展
以后,每次执行php脚本的时候,都会出现一个主进程+3个子进程,虽然不知道原理,但是目前得出这么个结论。 关闭grpc扩展
后,执行php脚本,就会只出现一个进程了.兼容pcntl_fork()与grpc的方法
php.ini
中增加配置: