2010-09-21 3 views
5

См. Также Having a PHP script loop forever doing computing jobs from a queue system, но это не отвечает на все мои вопросы.Попробуйте запустить PHP-скрипт навсегда, обратитесь в очередь

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

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

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

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

+0

1. В зависимости от того, что вы делаете. Некоторые расширения имеют некоторые серьезные утечки памяти. 2. Используйте своего рода сторожевую стражу. - 3. fork() в фоновом режиме. – halfdan

+0

Что именно он будет делать навсегда? Как это всегда будет работать? Когда он стекает в очередь, что он делает? И почему PHP? – Dolph

ответ

9

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

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

+0

Звучит здорово, может быть, мне тоже следует переписать моего демона. веселит. –

+0

+1 Я использую этот подход. Это просто и эффективно. – goat

0

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

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

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

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

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

1

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^