分叉进程:套接字传送期间失败:管道损坏
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)
现在我的想法是,这可能是因为分叉复制了父进程的内存堆栈,然后父进程和所有子进程都试图使用完全相同的数据库连接。一旦其中一个子进程完成,它就会退出并关闭连接,因为它被所有进程使用 - 其他进程将无法使用。
我觉得我的不是特例,所以我想知道如何解决这个问题?
我发现了一些以前的错误报告:
但我不确定解决此问题的官方最佳方法是什么。
目前我正在开发一个新的任务管理器,它可以 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)
现在我的想法是,这可能是因为分叉复制了父进程的内存堆栈,然后父进程和所有子进程都试图使用完全相同的数据库连接。一旦其中一个子进程完成,它就会退出并关闭连接,因为它被所有进程使用 - 其他进程将无法使用。
我觉得我的不是特例,所以我想知道如何解决这个问题?
我发现了一些以前的错误报告:
但我不确定解决此问题的官方最佳方法是什么。