Консольная очередь

У приложения есть несколько задач, которые, по идее, должны выполняться в консоли и пользователь не должен ждать окончания их выполнения. Или они должны стартовать по cron’у. Т.е. те, что инициировал пользователь, должны начать выполняться немедленно — загружен прайслист, нажата кнопка «обновить рейтинг». Также есть задания, выполняемые по расписанию: генерация sitemap, рассылка новостей почтой и т.д. Нашел три приемлемых решения, никак не могу выбрать.

  1. Использовать плагин CakePHP Queue. Мне не нравится в нем то, что он постоянно крутится отдельной задачей, проверяя каждые N минут наличие новых заданий. С одной стороны заданий планируется не так много, чтоб опрашивать каждые 10 минут, с другой — хочется, чтоб исполнение начиналось сразу после поступления нового. И задания должны быть оформлены в виде Tasks, но у меня уже есть консольные скрипты со своими tasks.
  2. Можно добавлять в отдельную таблицу задание (название скрипта и параметры) и запускать в бэкграунде (через exec(‘nohup…’) скрипт-диспетчер, который проверяет, выполняется-ли уже он сам и, если нет, начинает запускать скрипты, доставая их из этой таблицы. Запускать по-простому, с помощью exec(…). Если будет запущена вторая копия диспетчера, она сразу завершится. Так и будут выполнятся поочередно все задания, пока очередь не очистится. Можно добавлять задания из cron’а, можно из приложения. Раз задание хранится в БД, то можно и лог привязать к номеру этого задания, что тоже приятно. В этой схеме мне нравится все, кроме того, что для выполнения любого консольного скрипта будет запущено 2 копии php с cake. Одна для выполнения диспетчера, вторая — для выполнения задания.
  3. Диспетчером может быть не шелл-скрипт на Cake, а обычный bash-скрипт. Вот только доступа к БД у него нет и задания, наверное, придется записывать построчно в текстовой файл. Отслеживание блокировки файла, удаление строк с выполненными заданиями и прочее совсем не внушают оптимизма.

Я ничего не упустил? Может, есть еще какие-то более красивые и удобные варианты?

Автор

Сергей Родовниченко

Родился, учился, работал и все такое. Занимаюсь поддержкой сайтов на Shop-Script, Joomla, Wordpress, Prestashop. А также на самописных движках на базе CakePHP.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *