Я использую компонент 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);
}
Это приложение выполняется на сервере MAC под управлением OS X 10.8.4.
Я был бы признателен за любые подсказки о том, как преследовать корень этой проблемы.
Обновление №1: я упростил свою функцию для работы с базовыми командами, такими как ls
и date
, для более быстрого тестирования. Все еще похоже, что команда Process не работает после запуска и остановки около 1000-1500 процессов.
Я подозревал, что proc_close()
вызывался неправильно для каждого процесса, но дальнейшее расследование показало, что здесь это не так.