PHP: как сохранить доступ к вводу / выводу в parent после завершения дочернего процесса pcntl_fork()?

Я использую PHP и pcntl_fork(). Идея состоит в том, что родитель разветвляется и делает паузу для завершения ребенка; ребенок выполняет задание, затем завершается; родитель может проверить код возврата для задачи или состояние дочернего процесса и продолжить соответствующим образом.

(Задача изолирована от основного родителя путем разветвления, чтобы родитель мог хорошо очиститься, если задача сталкивается с непреодолимой проблемой времени выполнения, такой как поврежденные файлы "include" или отсутствующие библиотеки ключей, отсюда и ответвление, в основном я реализую простая изоляция процесса для, как мы надеемся, редкого случая, когда необратимое условие может вызвать проблемы)

Таким образом, проблема в том, что после pcntl_fork () оба процесса используют одни и те же дескрипторы ввода-вывода STDXXX, поэтому, как только дочерний процесс завершает свою задачу, ввод-вывод, который он использует, как обычно, закрывается, и поэтому они закрываются для родительского элемента как ну, это означает, что такие вещи, как echo(), используемые для продолжения взаимодействия с родителем, тоже внезапно перестают работать.

Я следую совету по php.net и использую posix kill -9 в дочернем элементе вместо exit, так что дочерний процесс завершается без закрытия IO, совместно используемого (и необходимого) с родителем, но есть более удобный способ сделать это?

Спасибо!

1 ответ

Перед pcntl_fork() Вы можете "дублировать" файл желаемых файловых дескрипторов, открыв, например, php://stdout а также php://stderr, или же php://fd/3, Смотрите протоколы php.


Обратите внимание, что когда дочерний элемент закрывает дескриптор файла, он не закрывается в родительском элементе. После разветвления процессы используют один и тот же указатель для открытия файлов, но вы все равно сможете получать эхо от родительского элемента после выхода из дочернего процесса.

Другие вопросы по тегам