<small>Предыдущие статьи:

- ➡️ [Раздел 24. Динамическая подпись](/docs/24-security-sign)
- ➡️ [Раздел 25. Защита доступа](/docs/25-security-access)
- ➡️ [Раздел 26. Принцип локализации](/docs/26-localization-principle)
</small>
# SLOT-H: Запуск сервера очередей

В системе реализован собственный сервер очередей для выполнения фоновых задач. Он работает через CLI-воркер, который запускается по расписанию и обрабатывает задачи в асинхронном режиме.

---

## Что такое сервер очередей

Сервер очередей - это механизм для выполнения задач, которые не должны выполняться синхронно в рамках HTTP-запроса. Примеры таких задач: отправка писем, создание дампов базы данных, парсинг данных, автоматический перевод текстов.

Задачи помещаются в очередь и обрабатываются фоновым процессом. Это освобождает пользовательский интерфейс от ожидания и позволяет выполнять ресурсоёмкие операции без влияния на скорость работы сайта.

---

## Структура сервера очередей

Сервер очередей состоит из двух основных компонентов:

- **Демон** (`demonAction`) - процесс-супервизор, который запускается по cron каждую минуту. Он проверяет, работает ли воркер, и перезапускает его при необходимости. Также демон следит за выполнением задач и очищает устаревшие логи.

- **Воркер** (`queueAction`) - основной процесс, который обрабатывает задачи из очереди. Он работает в бесконечном цикле: берёт новую задачу, запускает её обработку, ждёт секунду и повторяет.

---

## Запуск демона

Демон запускается через cron. В crontab добавляется запись:

```bash
*/1 * * * * php <путь к проекту>/Application/Tools/cli.php -stage=<имя ini-файла> -module=Base -controller=Cli -action=demon
```
Демон проверяет наличие работающего воркера каждую минуту. Если воркер не найден, демон запускает его и завершает работу.

## Запуск воркера
Воркер запускается демоном автоматически. Команда запуска:

```bash
php Application/Tools/cli.php -stage=<имя ini-файла> -module=Base -controller=Cli -action=queue -request=0
```
Воркер работает в бесконечном цикле до истечения заданного времени жизни (QUEUE_LIFETIME). После завершения цикла воркер перезапускается демоном.

## Обработка задач
Воркер получает задачи из таблицы queues. Для каждой задачи определяется её тип (action) и запускается соответствующий обработчик.

## Типы задач в демо-версии:

dump - создание дампа базы данных

Каждая задача выполняется в отдельном процессе, что позволяет обрабатывать несколько задач параллельно. Количество одновременных процессов регламентируется параметром во избежание чрезмерной нагрузки на сервер.

## Типы задач
Задачи в очереди делятся на два типа:

Возобновляемые - задачи, которые должны выполняться периодически. Например, парсеры валют или курсов. После завершения такой задачи (успешно или с ошибкой) она автоматически добавляется в очередь снова через заданный интервал времени.

Разовые - задачи, которые выполняются один раз. Например, отправка email или push-уведомлений. После завершения такие задачи не пересоздаются.

Для возобновляемых задач достаточно запустить процесс один раз, настроив периодичность. Например, задача получения валют с периодичностью раз в сутки: после завершения она автоматически будет добавлена в очередь через 86400 секунд.

## Мониторинг процессов
Демон регулярно проверяет состояние запущенных процессов. Если процесс завершился аварийно (по ошибке), он помечается воркером как абортированный (статус QUEUE_STATUS_ABORT). Это позволяет отслеживать проблемы и принимать меры.

## Логирование
Сервер очередей пишет логи в папку Config/Logs/<имя проекта>. Основные файлы логов:

queue - логи работы демона и воркера

dump - логи создания дампов

Логи помогают отслеживать работу сервера и диагностировать проблемы.

## Остановка сервера
Для остановки сервера необходимо:

Удалить задачу из cron

Абортировать все процессы, использующие cli.php

Команда для остановки всех процессов очереди:

```bash
pkill -f "cli.php.*-action=queue"
```
Или более мягкий вариант - найти и завершить конкретные процессы через 
```bash
ps aux | grep cli.php
```

## Особенности
Сервер очередей работает только в CLI-режиме. Запуск через веб-интерфейс невозможен.

Демон и воркер используют один и тот же конфигурационный файл проекта.

Задачи могут быть запланированы на определённое время через поле queue_time. Если время не указано, задача выполняется немедленно.

При ошибке выполнения задачи её статус меняется на QUEUE_STATUS_ERROR, и она может быть обработана повторно.

Аварийно завершённые процессы помечаются статусом QUEUE_STATUS_ABORT.

---

## Что дальше?

- ➡️ [Раздел 28. Задачи сервера очередей](/docs/28-queue-tasks)
- ➡️ [Раздел 29. Хелперы](/docs/29-utils-helpers)
- ➡️ [Раздел 30. Демо-версия vs Полная версия](/docs/30-camparison)
