Пусть PHP-скрипт будет работать вечно, получайте доступ к очереди - PullRequest
5 голосов
/ 21 сентября 2010

См. Также Наличие цикла сценариев PHP, выполняющего вычислительные задания из системы очередей , но это не отвечает на все мои вопросы.

Если я хочу вечно запускать скрипт PHP, получать доступ к очереди и выполнять задания:

  1. Каков потенциал проблем с памятью? Как их избежать? (какие-либо функции сброса или что-то, что я должен использовать?)

  2. Что, если скрипт по какой-то причине умрет? Какой будет хороший способ автоматически запустить его снова?

  3. Какой самый лучший базовый подход для запуска скрипта. Так как он работает вечно, мне не нужен cron. Но как мне его запустить? (См. Также 2.)

Ответы [ 3 ]

9 голосов
/ 21 сентября 2010

Установить очередь как скрипт cron. Пусть это выполняется каждые 10 секунд. Когда сценарий запускается, проверьте, присутствует ли файл блокировки (что-то вроде .lock). Если есть, немедленно выйдите. Если нет, создайте .lock и начните обработку. Если возникнут какие-либо ошибки, напишите / зарегистрируйте эти ошибки, удалите .lock и выйдите. Если задач нет, выйдите.

Я думаю, что этот подход идеален, поскольку PHP на самом деле не предназначен для возможности запуска сценария в течение продолжительных периодов времени, как вы просите. Чтобы избежать возможных утечек памяти, сбоев и т. Д., Непрерывный запуск сценария является лучшим подходом.

1 голос
/ 17 января 2011

Хотя PHP может обращаться к (публиковать и потреблять) MQ, если это возможно, попробуйте использовать для этого полнофункциональное приложение MQ.

Полнофункциональное приложение MQ (в ruby, perl, .NETjava и т. д.) будет обрабатывать все проблемы параллелизма, регистрации ошибок, управления состоянием и масштабируемости, которые вы обсуждаете.

0 голосов
/ 21 сентября 2010

Не заходя слишком далеко с конечными автоматами, по крайней мере, было бы неплохо представить состояния как для «заданий» (пример: преобразование flv2avi), так и «заданий» (flv2avi 1.flv).

На моемскрипт (Perl), иногда процессы зомби начинают снижать производительность всего скрипта.Это редкий случай, но он является исходным по исходному тексту, поэтому сценарий должен быть в состоянии прекратить чтение очереди больше, позволяя новому экземпляру продолжать выполнение своих задач и заданий;однако, хранение как можно большего количества данных запущенных задач приветствуется.Как только первый экземпляр имеет 1-2 задачи, он уничтожается.

При запуске: проверка на наличие распространенных ошибок (из-за выключения), проверка на наличие известных ошибок (нехватка места, не может прочитать ввод), уничтожение любого, что может бытьубить и установить статус «ожидание», начать все ожидания.

Если вы запускаете конвейерные задания (vlc | ffmpeg, tail -f | grep), вы можете попытаться избежать использования слишком большого количества операций ввода-вывода в вашей программе.вместо того, чтобы делать fork () (плохая идея для PHP?) или просто вызывать / bin / bash -c "prog1 | prog2", это значительно экономит нагрузку на процессор.

Начальные точки: оба / etc / rc.d и cron (проверить процессы, запустить первый экземпляр ||, запустить второй с аргументом 'debug')

...