====== Интеграция и работа с очередью ====== В InstantCMS присутствует механизм "очередей". Это набор заданий, которые выполняются последовательно, согласно очередности и приоритета. После успешного выполнения задания, оно удаляется. У задания очереди есть состояния: * Ожидает выполнения; * Выполняется; * Ожидает повторного выполнения; * Завершено с ошибкой. Очередь запускается по CRON при помощи системного [[manual:settings:scheduler|планировщика]]. За одно выполнение запускаются 20 задач очереди. Система очередей интегрирована в компоненты [[manual:components:messages|Личные сообщения]] и [[manual:components:subscriptions|Подписки]]. ===== Работа с очередью ===== Вся работа с очередью заключается в большинстве случаев в постановке задания в очередь. Обслуживается это системным классом ''cmsQueue'', в котором все методы статические. Класс можно дополнить/переопределить, в нём используется [[http://php.net/manual/ru/language.oop5.late-static-bindings.php|позднее статическое связывание]]. ==== Методы ==== Все методы класса являются статичными. === cmsQueue::pushOn === pushOn(string $queue, array $data, integer $priority = 1) : integer Добавляет задание в очередь. **Параметры** ^ Тип ^ Имя ^ Описание ^ | string | $queue | Имя очереди. | | array | $data | Основные данные очереди. | | integer | $priority | Приоритет задания, по умолчанию 1. | === cmsQueue::pushOnLater === pushOnLater(string $queue, array $data, integer $priority = 1) : integer Добавляет задачу в очередь с отсрочкой в секундах или по дате. **Параметры** ^ Тип ^ Имя ^ Описание ^ | mixed | $date | Количество секунд для смещения от текущего времени или полная дата. | | string | $queue | Имя очереди. | | array | $data | Основные данные очереди. | | integer | $priority | Приоритет задания, по умолчанию 1. | В обоих случаях в массиве $data передаются непосредственно полезные данные очереди, например: cmsQueue::pushOn('email', array( 'controller' => 'messages', 'hook' => 'queue_send_email', 'params' => array( $to, $letter, $is_nl2br_text ) )); Массив $data должен содержать ячейки: * **controller** - название контроллера (обязательно); * **hook** - название [[dev:controllers:hooks|хука]] контроллера (необязательно); * **action** - название [[dev:controllers:actions|экшена]] контроллера (необязательно); * **params** - параметры, передаваемые в хук или экшен (необязательно). Должен быть передан либо **hook**, либо **action**. Если будет переданы оба параметра, вызовется сначала хук, потом экшен с одинаковыми параметрами **params**. Обратите внимание, что при выполнении задания в хук или экшен первым параметром всегда будет передаваться текущая попытка выполнения ''$attempts''. ===== Обработка очереди ===== Само выполнение задания очереди - это стандартный хук или экшен контроллера. При использовании хука, как метода исполнения задания очереди, нет необходимости его описывать в [[dev:controllers:hooks#манифест|файле манифеста]] контроллера. Исполняющий хук или экшен задания **строго** может возвращать: * булево true - в этом случае движок будет считать, что задание выполнено успешно и удалит его из очереди; * булево false - задание выполнено, но будет запущено еще раз, пока не будет достигнуто максимальное кол-во перезапусков (по умолчанию 4); * любая строка, которая будет означать текст ошибки выполнения. Выполнение каждого задания заключено в обработку [[http://php.net/manual/ru/language.exceptions.php|исключений]], поэтому все возможные ошибки выполнения отслеживаются и в случае их наличия, будут записаны в задание. Пример реализации хука можно посмотреть [[https://github.com/instantsoft/icms2/blob/master/system/controllers/messages/hooks/queue_send_email.php|здесь]] или [[https://github.com/instantsoft/icms2/blob/master/system/controllers/subscriptions/hooks/send_letters.php|здесь]]. ===== Интеграция списка заданий очереди в админке ===== Для удобной интеграции списка очереди, используемой в контроллере, необходимо в контроллере админки объявить следующее свойство (на примере контроллера подписок): public $queue = array( 'queues' => array('subscriptions'), // имена очередей, используемых в контроллере 'queue_name' => LANG_SBSCR_QUEUE_NAME, // общее название этих очередей 'use_queue_action' => true // флаг, разрешающий добавить раздел очередей в админку компонента ); Для заданий очереди будут доступны действия удаления и перезапуска. ---- [[dev:integration|К оглавлению раздела "Интеграция"]] ---- [[dev:start|К оглавлению документации для разработчиков]]