Фоновая задача php, cron альтернативы

У меня есть несколько фоновых задач в моем php-проекте. Это должно сделать некоторую работу, если какое-то условие выполнено. Например: если есть некоторые заказы, которые еще не доставлены, а оставшееся время для оценки доставки составляет менее 15 минут, система отправляет курьеру уведомление о том, что он, вероятно, опоздал.

Самое простое решение — создать задачу cron, которая запускает скрипт php каждую минуту. Этот сценарий проверит это условие и отправит уведомление, если условие выполнено.

Другой подход — очереди. Я посмотрел на gearman и rabbitmq, но, как я вижу, они для другого варианта использования. Они подходят, если у вас есть клиент, который напрямую отправляет задачи. В моем случае у меня нет клиента, просто какое-то условие в системе.

И последнее решение, которое я понял, это написать собственный php-демон с бесконечным циклом. В каждой итерации он проверяет состояние, выполняет работу, если она удовлетворена, и спит в течение 1 минуты. Но возможны проблемы с утечками памяти, перезапуском демона и т. Д.

Итак, что является лучшим решением этой проблемы в современном php?

0

Решение

Если вы не любите использовать cronjob, я думаю, что вам лучше всего написать демона. Мне нравится программировать на Perl, и на вашем месте я написал бы демон на Perl.

Однако, если бы я написал демон на PHP, я бы запустил другой скрипт резервного копирования в cronjob (например, с 10-минутным интервалом), который проверит, работает ли мой демон php или нет, и перезапустит демон, если он не работает.

0

Другие решения

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

while (1) {
// run forever scripts
}

и они бежали месяцы без ошибок; они обрабатывали очереди сообщений, которые были простыми таблицами mysql. Но если вы сделаете это, вам понадобится работа cron, которая проверяет while (1) состояние процесса, вам понадобится некоторая блокировка для предотвращения многократного запуска процесса и т. д. Просто используйте cron.

0

Я бы сделал небольшое приложение для nodejs для этой очереди или очередей laravel:

https://laravel.com/docs/5.3/queues

Тебе решать.

-1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector