目录
前文
上次遇到这个问题已经是N久(1年)以前的事情了。主要因为今天的场景需要workerman进程运行N次后重启,出现该bug,会导致重启失败。啊啊啊!!!!!所以又开始搜索一下看看有没有新的信息。
新信息
-
我发现文档更新
更新时间:(2022-5-11)
第五种可能性
安装了grpc扩展,但是没有给grpc扩展设置相应的环境变量,启动后会多fork出一个挂载进程,停止时导致失败。
-
论坛内的一个帖子
启动出现了两个master进程,求助,这居然是个2019年的帖子,之前居然没找到。
其中关键信息是:
那么怀疑极有可能是 glibc 的问题【即glibc的fork可能有bug】,你看下两台机器的 glibc 库版本一致吗?
问题找到了,安装了一个grpc的扩展,然后这个扩展必须要给对应的环境变量,不然fork的时候就会出现多一个挂载进程。给后来的同学参考:以后出现这类的问题,也可以考虑下安装的扩展本身在workman进行fork的时候带来的问题
嗯,对, 很多参差不齐的PHP扩展也会带来潜在的隐患,据观察,还不在少数。
我的情况
回忆了下,应该是属于第二种,V2ray 其中有系统api,协议是 grpc。当时应该是为了测试接口装了这个扩展。
解决方法
搜索的关键词是“grpc fork 冲突”,参考第一篇文章Php的swoole和grpc扩展一起使用时kill不能杀死swoole进程的问题 Grpc的fork模式问题 .
幸运的是,第一个方法就解决了,也没出现文章中的死锁。
在php.ini中增加配置:
grpc.enable_fork_support = 1
grpc.poll_strategy = epoll1