Фоновые процессы PHP - PullRequest
       0

Фоновые процессы PHP

1 голос
/ 29 сентября 2011

Я занимаюсь разработкой сайта, который требует много фоновых процессов для запуска сайта. Например, очередь, видеокодер и несколько других типов фоновых процессов. В настоящее время они работают как PHP-скрипт cli, содержащий:

while (true) {

    // some code

    sleep($someAmountOfSeconds);

}

Хорошо, они работают нормально и все, но я думал об их настройке в качестве демона, который даст им фактический идентификатор процесса, который я могу отслеживать, а также я могу запускать их в фоновом режиме и не иметь постоянно открытый терминал . * * 1004

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

Есть предложения?

Ответы [ 5 ]

2 голосов
/ 29 сентября 2011

Создание демона, которому вы можете звонить и задавать вопросы, может показаться разумным вариантом. Зависит от того, разрешает ли ваш хостер такие вещи, особенно если вам требуется, чтобы он работал каждые несколько секунд, тогда определенно сервисный демон / сервис на базе ОС будет казаться гораздо более разумным, чем все остальное.

1 голос
/ 22 июля 2012

Я делал это в течение 5 лет, используя PHP для выполнения фоновых задач, и это ничем не отличается от работы на любом другом языке. Просто используйте CRON и заблокируйте файлы. Файл блокировки предотвратит запуск нескольких экземпляров вашего скрипта.

Также важно следить за вашим кодом, и одна проверка, которую я всегда делаю, чтобы не допустить запуска устаревших файлов блокировки, запускает второе задание CRON, чтобы проверить, старше ли файл блокировки, чем несколько минут, и если экземпляр скрипт PHP работает, если нет, то удаляет файл блокировки.

Использование этой техники позволяет настроить CRON для запуска сценария каждую минуту без проблем.

1 голос
/ 29 сентября 2011

Вы можете создать демон в PHP, но по моему опыту это очень тяжелая работа, и результат ненадежен из-за управления памятью в PHP и обработки ошибок.

У меня была та же проблема, я хотел написать свою логику на PHP, но демонизировать ее должна стабильная программа, которая могла бы перезапустить сценарий PHP в случае сбоя, и поэтому я написал Fat Controller .

Он написан на C, работает как демон и может запускать PHP-скрипты или что угодно. Если скрипт PHP завершается по какой-либо причине, Fat Controller перезапустит его. Это означает, что вам не нужно заботиться о демонизации или исправлении ошибок - все это обрабатывается за вас.

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

http://fat -controller.sourceforge.net / потребительная cases.html

0 голосов
/ 29 сентября 2011

Одним из решений (которое мне действительно нужно попробовать самому, а мне может понадобиться), является использование cron, но зацикливание процесса на пять минут или около того. Затем заставляйте cron запускать его каждые пять минут. Когда один умирает, следующий должен заканчивать (или близок к завершению).

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

Этот подход не слишком технологичен, но помогает избежать зависания PHP в долгосрочной перспективе - перезапуск встроенной задачи!

0 голосов
/ 29 сентября 2011

Используйте модуль System :: Daemon от PEAR.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...