Задать вопрос
v_k
@v_k

Можно ли в PHP из дочернего процесса создавать еще дочерние процессы?

В PHP не работает как надо функция popen() при вызове из дочернего процесса при использовании pcntl_fork(). Подскажите пожалуйста возможно ли это сделать?

Задача в том, чтобы из дочернего процесса можно было параллельно вызвать процесс, который создал бы еще кучу подпроцессов.
  • Вопрос задан
  • 173 просмотра
Подписаться 1 Сложный Комментировать
Помогут разобраться в теме Все курсы
  • Skillfactory
    Профессия Fullstack веб-разработчик на JavaScript и PHP
    20 месяцев
    Далее
  • Хекслет
    PHP-разработчик
    10 месяцев
    Далее
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
Решения вопроса 1
@rPman
php прекрасно создает процессы как с помощью popen так и с помощью exec/passthru, запуская како-нибйдь nohup или просто указывая в конце команды &, а еще есть расширение parallel
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
dollar
@dollar
Делай добро и бросай его в воду.
В PHP можно создавать процессы внутри процессов, но есть некоторые нюансы, которые следует учитывать.

Когда ты вызываешь pcntl_fork(), ОС создает копию текущего процесса. Этот новый процесс наследует от родительского процесса все открытые файлы и соединения. Это включает в себя все файлы, открытые с помощью popen(), fopen(), сокеты, соединения с базой данных и т. д.

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

Если ты хочешь использовать popen() или другую функцию, которая создает новый процесс или открывает новое соединение, в дочернем процессе после вызова pcntl_fork(), ты должен убедиться, что родительский процесс не закрывает этот файл или соединение до тех пор, пока дочерний процесс не закончит его использование.

Кроме того, ты можешь столкнуться с проблемами с буферизацией вывода. Функции вроде popen() обычно буферизуют свой вывод, и если ты не очистишь буфер перед тем, как завершить процесс, ты можешь потерять часть вывода. Ты можешь использовать функции вроде fflush() для очистки буфера перед завершением процесса.
Ответ написан
v_k
@v_k Автор вопроса
ChatGPT подсказывает, что можно использовать модуль pthreads. Так ли это?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
FoodSoul Калининград
от 180 000 до 250 000 ₽
IT-Spirit Москва
от 230 000 до 320 000 ₽
от 200 000 до 290 000 ₽