Ruhighload team is looking for Technical Editor in Chief. Details and application.

При использовании очередей сообщений Вам может понадобится запускать PHP процессы, которые должны работать постоянно. Для этого есть несколько подходов:

1. Cron

Можно использовать cron для запуска и перезапуска процессов:

crontab -e

Добавляем туда:

*       *        * * *    if [ $(ps aux | grep 'worker1' | grep -v grep | wc -l | tr -s "\n") -lt 5 ]; then /usr/bin/php /var/www/worker1.php >> /var/log/php.worker1.log; fi

При добавлении в cron этой инструкции она будет запускать скрипт worker1.php до тех пор, пока не будет работать 5 таких скриптов одновременно.

Если нужно запустить только один процесс:

*       *        * * *    if [ $(ps aux | grep 'worker1' | grep -v grep | wc -l | tr -s "\n") -lt 1 ]; then /usr/bin/php /var/www/worker1.php >> /var/log/php.worker1.log; fi

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

2. Supervisord

Supervisord позволяет организовать работу фоновых PHP процессов очень удобно. Установка на Debian:

apt-get install supervisor

В файле конфигурации (nano /etc/supervisor/supervisord.conf), в самом низу добавляем настройки для нужного воркера:

[program:worker]
command=/usr/bin/php /var/www/worker.php
numprocs=1
directory=/var/www/worker
stdout_logfile=/var/log/worker.log
autostart=true
autorestart=true
user=www-data
stopsignal=KILL

# Запустит 1 процесс указанного скрипта

Для запуска нескольких копий одного процесса необходимо также указать параметр process_name для определения уникального имени процесса

[program:worker]
command=/usr/bin/php /var/www/worker.php
process_name=%(program_name)s_%(process_num)02d
numprocs=10
directory=/var/www/worker
stdout_logfile=/var/log/worker.log
autostart=true
autorestart=true
user=www-data
stopsignal=KILL

# Запустит 10 одновременных процессов указанного скрипта

После этого достаточно перезапустить supervisor и worker.php сразу запустится:

/etc/init.d/supervisor stop
/etc/init.d/supervisor start

Supervisor сам будет следить за процессами, запускать их в случае падения, а также после перезагрузки системы. Вы можете запускать несколько копий процессов, указывая их количество в параметре numprocs.