我正在使用 Symfony2 Process 组件来手动管理进程池。
在下面的示例中,我每 2 秒重新启动 2 个简单进程并监视发生的情况。重新启动这些进程数百次后,应用程序会中断。
执行已停止,我收到以下 PHP 警告:
proc_open(): unable to create pipe Too many open files
然后 Symfony Process 组件抛出以下异常:
[Symfony\Component\Process\Exception\RuntimeException]
Unable to launch a new process.
我已经手动监控了打开进程的总数,它永远不会达到预期的限制。
下面的简化片段是 Symfony2 命令的一部分,并且正在从 CLI 运行(例如 app/console hamster:run):
$processes[] = new Process("ls > /dev/null", null, null, null, 2);
$processes[] = new Process("date > /dev/null", null, null, null, 2);
while (count($processes) > 0) {
foreach ($processes as $i => $process) {
if (!$process->isStarted()) {
$process->start();
continue;
}
try {
$process->checkTimeout();
} catch (\Exception $e) {
// Don't stop main thread execution
}
if (!$process->isRunning()) {
// All processes are timed out after 2 seconds and restarted afterwards
$process->restart();
}
}
usleep($sleep * 1000000);
}
此应用程序正在运行 OS X 10.8.4 的 MAC 服务器上运行。
我将不胜感激有关如何追查此问题根源的任何提示。
更新#1:我已经简化了我的功能,可以使用基本命令,例如ls
更快date
的测试。在启动和停止大约 1000-1500 个进程后,Process 命令看起来仍然失败。
我怀疑proc_close()
每个进程都没有正确调用它,但进一步调查显示这里不是这种情况。