Comments 25
Зависит конечно от задачи, но обычно если требуются частые равномерные промежутки, то
нужно демонёнка ваять.
Ойвэй, всё будет, дорогой.
И смещения и отсутствие контроля.
А ещё кто-то параллельно что-то на сервере запулит так, что вообще ничья больше крон-задача не запустится минут с полчаса.
Правильно в камментах говорят, не для php задача.
> /dev/null 2>&1
отменили?Разумеется, классический cron для этого не подходит — его нужно усовершенствовать.
Нет, не нужно.
Также, в данном случае речь идет всего лишь про статусы задач, поэтому лучше будем использовать файловую систему сервера.
Это не лучше, чем дергать MySQL, даже, скорее, наоборот.
Вы описали типичную асинхронную задачу, соотвественно, инструменты стоит использовать подоходящние, cron здесь не лучший выбор.
В общем случае, стоит гуглить "Server side events".
Посмотрите в сторону WebSocket решений. Рекомендую Сentrifugo (на Хабре достаточно статей об этом продукте, причем, непосредственно от автора проекта) .
Это автономный сервер, способный стать "прослойкой" между вашим фронтом и беком.
Очень грубо говоря ваша схема (она весьма типична) может выглядеть так:
- Со стороны фронта устанавливаем WS подключение к Сentrifugo и подписываемся на определенное событие — окончание вашей задачи.
- Отправляем дефолтный XHR запрос на бекенд, инициализируя начало выполнение задачи.
- Когда бекенд закончит выполнение задачи, он должен уведомить Сentrifugo о наступлении этого события (через соотвествующий API).
- В свою очередь Сentrifugo в тот же момент уведомит всех, кто подписан на этот ивент.
гугл: "брокер сообщений" — для задачи.
В вашем решении крон не будет запускаться чаще чем раз в минуту. Нечто будет выполняться чаще чем раз в минуту, крон останется такой же.
man flock
man zk-flock, если распределенно
Что-то не так либо с постановкой задачи, либо с выбранным инструментом. cron без костылей — прост и изящен. 2 костыля сразу (запуск через 10 секунд и защита от повторного запуска) — это перебор.
Если нужны частые запуски задач — лучше сделать сервис, который через определенные промежутки времени будет дергать задачу.
Я прошу прощения но очередь задач в базе уже плохая идея. Кафка, кролик или что то ещё вроде gearman.
лучше будем использовать файловую систему сервера.
Откуда вы такое взяли?
Вы чисто переводчик?
Для некоторых задач по автоматизации бизнес процессов максимально допустимая задержка часто составляет не более чем 1-1.5 секунды.
Типичное использование cron это задачи системного (не бизнес) уровня. Например ротация логов — собственно только ротация логов.
То что на бизнес-уровне нужен какой-то инструмент — это факт. И эта потребность была закрыта инcтрументами которые называются job queue. Собственно задачи там могут выполняться сразу после постановки в очередь, однократно с задержкой, по расписанию.
Как запускать cron чаще, чем раз в минуту при помощи PHP