2012-12-10 3 views
7

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

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

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

+1

Обратите внимание, что если вы используете общий веб-хост, ваш хост может не разрешать выполнение сценариев в течение длительных периодов времени. В результате вам, возможно, придется выполнить работу (если возможно). –

ответ

16

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

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

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

1

вы можете введите команду

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