inlanger
@inlanger
Django программист

Простейшая очередь задач на PHP?

Посоветуйте простейшую очередь задач на PHP вроде python-rq для языка Python. Я начал смотреть популярные решения вроде Gearman, но по сравнению с приведенным мной аналогом это какой-то монстр. На Python я могу перед функции указать декоратор @job('low', conn=my_redis_conn, timeout=5) и вся моя функция просто выполнится в фоне и веб-приложение не будет ждать ее выполнения. А на том же Gearman нужно писать гору лишнего кода. Я пробовал гуглить, но по теме выдаются еще более огромные zeromq и прочие mq, на которых ну никак не решить задачу в пару строк кода.
  • Вопрос задан
  • 12152 просмотра
Пригласить эксперта
Ответы на вопрос 8
@Ualde
Очередь задач решается с помощью Gearman, тут вы совершенно правы.

Если требуется же запустить просто параллельный процесс — вы можете его форкнуть или создать новый.
Ответ написан
Stdit
@Stdit
Один из самых простых способов организации фоновых задач (таких как отправка письма, например) — делегировать их скрипту в cron-е через базу данных. То есть записывать задачу с аргументами в таблицу-очередь, а кроном эту очередь разбирать по таймеру. Если по каким-то причинам это не подходит (например, из-за скорости реакции или нагрузки на бд), то наверное смотреть в сторону gearman.
Ответ написан
@Claud
Простых конструкция аля go в golang вы не найдете. Любое решение так или иначе потребует больше кода и установки дополнительных библиотек. посмотрите в строну Reack, для него есть библиотека async, но я сам ей не пользовался по этому не знаю как оно на самом деле работает.
Ответ написан
есть еще phpDaemon, который работает как классический демон, вполне может разбирать очередь задач. В SPL, кстати, есть структура для удобной работы с очередями — SplQueue.
Ответ написан
@nighten
Предлагаю посмотреть на RabbitMQ. www.rabbitmq.com/
Ответ написан
konst20
@konst20
Программист, преподаватель, немного электронщик
А на том же Gearman нужно писать гору лишнего кода

Это еще почему?
$client = new GearmanClient();
$client->doBackground(<function>, <data>);

Как раз пара строк кода.
Ответ написан
@greezly2020
Потратитель времени на ответы в Habr. =)
Посмотрите в строну очень просто и легковесного как Gearman брокер сообщений beanstalk. Beanstalk пользуется большей популярностью чем Gearman. Впервые она была сделана для Facebook.

Репозиторий:
https://beanstalkd.github.io/.

Для работы на PHP установите библиотеку через Composer:
https://packagist.org/packages/pda/pheanstalk
PHP клиент часто обновляется и дорабатывается в отличии от Gearman, расширение которого устанавливается через PEAR.

Читайте официальную документацию!

Мне нравится Gearman. Например в отличии от Gearman который просто раздает задачи, у beanstalkd имеется API, где в коде воркера можно отправить команду на удаляете выполненной задачи из очереди.
Я например пользуюсь в одном из проектов - Gearman. И если задача из очереди выполнена воркером неправильно или не выполнена вообще, я помещаю ее снова в очередь с высоким приоритетом. Если не выполняется второй раз. То добавляю ее в базу данных как ошибка.

Подробнее про Beanstalk.
1. https://badcode.ru/chto-takoie-php-ochieried-zadach/.
2. https://badcode.ru/ochieriedi-v-proghrammirovanii-...
Та же есть статья о супервизоре.

Также Redis используют в качестве очереди сообщений если хотите свой брокер сделать под себя. Основное назначение Redis No-SQL база данных.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы