Задать вопрос

Как правильно сделать несколько параллельных циклических процесса на PHP?

Доброго времени суток.

Есть несколько процессов(пока два, но дальше - больше), которые должны выполняться параллельно и без остановки.
Попытки решения, которые я пытался реализовать:

1. Запустить процессы из командной строки в фон(php artisan command > /dev/null 2>&1 &), а сам скрипт просто зациклить "на вечно" или пока не сработает условие остановки. Проблема: все работает, но происходит утечка памяти, не существенная, но все же через несколько часов процесс отваливается с ошибкой нехватки памяти.

2. Запустить процессы из командной строки в фон(php artisan command > /dev/null 2>&1 &), а сам скрипт зациклить на несколько итераций, после чего вновь запустить его самого из себя( exec('bash -c "exec nohup php artisan command > /dev/null 2>&1 &"')). Проблема: не понятно по какой причине(по крайней мере в логах php и nginx ничего нет) не всегда происходит самозапуск скрипта.

3. Думал использовать Gearman`а, но установка его под винду - задача не из простых и понятных.

4. Крон с lock файлом. Проблема: цикл должен происходить примерно раз в 3 сек и не понятно когда заводить крон для проверки и повторного запуска, в идеале бы раз в секунду, но это как то не круто.

Подскажите, что еще можно сделать?

Спасибо.
  • Вопрос задан
  • 411 просмотров
Подписаться 3 Средний Комментировать
Решения вопроса 2
R0dger
@R0dger
Laravel/Yii/2 AngularJs PHP RESTful API
Очереди не подходят? Есть событие, вы его в очередь, дальше из очереди достали и выполнили, или я что-то пропустил?
Ответ написан
@2vtlk
Задачу так и не понял, но для управления процессами отлично подходит пакет symfony/process

https://symfony.com/doc/current/components/process.html

разруливать параллельные/последовательные процессы с ним одно удовольствие
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
alexfilus
@alexfilus
Senior backend developer
php artisan queue:work
В настройках Supervisor указать
numprocs=2 (или сколько их там надо)
Примерно так:
program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php -d allow_url_fopen=On -d open_basedir=/ -d disable_functions= /data/server/www/artisan queue:work --queue=high  --sleep=3 --tries=3
autostart=true
autorestart=true
user=srcacc
numprocs=2
redirect_stderr=true
stdout_logfile=/data/server/www/storage/logs/worker.log
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы