PHP – длительная фоновая задача

В настоящее время я пытаюсь создать epub на demenad из контента, доступного мне. К сожалению, когда есть много контента для epub, требуется некоторое время (10 минут в некоторых случаях) для завершения HTTP-запроса – что не является идеальным

Я хочу следовать подходу, подобному подходу Safari. Генерируйте epub и отправляйте по электронной почте пользователю, когда документ доступен.

Мой вопрос: какой лучший способ для запуска фоновой задачи / потока в PHP, который может занять много времени?

Вы хотите быть осторожным с длительными PHP-процессами, поскольку один PHP не очень эффективен с точки зрения памяти (например, массив из 100 ints в PHP может потреблять до 15 Кбайт памяти). Обычно это нормально для 99% случаев использования, так как большинство людей просто используют PHP для веб-сайтов, и эти процессы работают на долю секунды, чтобы память была принесена в жертву за скорость. Однако для долговременного процесса (особенно если у вас их много) это может быть не лучшим решением.

Вы также хотите быть очень осторожными, вызывая функции exec / shell_exec как PHP, поскольку они внутренне реализованы как потоки (т. Е. Они могут вызвать блокировку в родительском процессе, поскольку обычно ему приходится ждать, пока поток вернет данные).

Один из вариантов фоновой задачи – использовать fork . Тем не менее, я настоятельно рекомендую использовать подходящий менеджер заданий, такой как gearman (см. Также расширения php ), или очередь, например amqp или zmq , для более чистого управления этими задачами. Какой из них более подходит для вашего случая использования, я позволю вам решить.

вы можете запустить команду

$command = 'nohup >/dev/null 2>&1 /your/background/script.php &'