分叉进程:套接字传送期间失败:管道损坏

Forked process: Failure during socket delivery: Broken pipe

目前我正在开发一个新的任务管理器,它可以 create/fork 新进程并从数据库中执行给定的任务。

这是 php(7.4.18 定制)项目的一部分,其中包含 mongodb(4.2 数据库、1.9.1 php 扩展、1.5.2 mongodb/mongodb wrapper package and 2.1.11 yiisoft/yii2-mongodb wrapper package)

所以它的工作方式是我每隔 X 秒汇集一次数据库,如果我能看到至少 1 个任务,那么我会在父进程中获取它,然后如果有足够的空闲内存用于新任务任务,然后我 fork 进程(使用 pcntl)并在子进程中执行任务。

问题是我在日志中收到一条错误消息,内容为:套接字传送期间失败:管道损坏 (32)

现在我的想法是,这可能是因为分叉复制了父进程的内存堆栈,然后父进程和所有子进程都试图使用完全相同的数据库连接。一旦其中一个子进程完成,它就会退出并关闭连接,因为它被所有进程使用 - 其他进程将无法使用。

我觉得我的不是特例,所以我想知道如何解决这个问题?

我发现了一些以前的错误报告:

但我不确定解决此问题的官方最佳方法是什么。

您应该从您正在使用它的进程中创建一个新的客户端实例。

如果您处于无法轻松创建新客户端实例的环境中,请参阅 here for how this generally is supposed to work, and here

据我所知,php 中的分叉并不常见,因此您应该弄清楚是否可以在子进程中创建新的全新客户端,并在可能的情况下执行此操作,否则处理错误并重新连接。