См. Также Наличие цикла PHP-скрипта, который навсегда выполняет вычисления из системы очередей , но это не отвечает на все мои вопросы.
Если я хочу навсегда запустить PHP-скрипт, доступ к очереди и выполнение заданий:
Каков потенциал проблем с памятью? Как их избежать? (любые функции флеша или что-то, что я должен использовать?)
Что, если сценарий умирает по какой-то причине? Что было бы хорошим способом автоматически запустить его снова?
Какой был бы лучший базовый подход для запуска скрипта. Поскольку он работает вечно, мне не нужен cron. Но как мне начать? (См. Также 2.)
Установите очередь в виде скрипта cron. Выполняйте его каждые 10 секунд. Когда сценарий запускается, проверьте наличие файла блокировки (что-то вроде .lock). Если есть, немедленно выйдите. Если нет, создайте .lock и начните обработку. Если возникнут какие-либо ошибки, отправьте по электронной почте / зарегистрируйте эти ошибки, удалите .lock и выйдите. Если задач нет, выйдите.
Я думаю, что этот подход идеален, поскольку PHP не предназначен для запуска сценария в течение длительных периодов времени, как вы спрашиваете. Чтобы избежать возможных утечек памяти, сбоев и т. Д., Непрерывный выполнение сценария – лучший подход.
Хотя PHP может получать доступ (публиковать и потреблять) MQ, если это вообще возможно, попробуйте использовать полностью функциональное приложение MQ для этого.
Полностью функциональное приложение MQ (в ruby, perl, .NET, java и т. Д.) Будет обрабатывать все проблемы параллелизма, ошибок, управления состоянием и масштабируемости, которые вы обсуждаете.
Не заходя слишком далеко с государственными машинами, по крайней мере, это хорошая идея ввести государства как в «рабочие места» (пример: преобразование flv2avi), так и «задачи» (flv2avi 1.flv).
В моем сценарии (Perl) иногда процессы зомби начинают понижать производительность всего скрипта. Это редкий случай, но он является родным в источнике, поэтому скрипт должен иметь возможность больше перестать читать очередь, позволяя новому экземпляру продолжать выполнять свои задачи и задания; тем не менее, сохранить как можно больше данных о запущенных задачах. Когда первый экземпляр имеет 1-2 задания, он убивается.
При запуске: проверьте общие ошибки (из-за выключения) проверьте известные ошибки (вне места, не можете прочитать ввод) убить все, что может быть убито, и установить статус на «ожидание», чтобы начать все ожидания.
Если вы запускаете заданные по трубопроводу задания (vlc | ffmpeg, tail -f | grep), вы можете попытаться избежать использования слишком большого объема ввода-вывода в своей программе, вместо этого вместо fork () (плохая идея для PHP?) Или просто вызов / bin / bash -c "prog1 | prog2", это экономит много нагрузки процессора.
Начальные точки: как /etc/rc.d, так и cron (проверить процессы, запустить первый экземпляр || выполнить второй с аргументом «debug»)