skynet / core-module
Core module for HostCMS
Package info
gitlab.com/hostcms/skynet/core-module
Type:hostcms-module
pkg:composer/skynet/core-module
Requires
- php: >=8.1
- skynet/core-admin: *
- skynet/core-skin: *
- skynet/installers: dev-master
This package is auto-updated.
Last update: 2026-05-13 13:38:05 UTC
README
Для отработки события после AJAX, в ответе должен быть ключ триггер с массивом:
... 'trigger' => ['(#,.)имя ноды'], ...
Очередь задач
Очередь задач находится в modules/skynetcore/queue/ и хранит задачи в таблице
skynetcore_queue_tasks. Таблица создается автоматически при первом обращении к
Skynetcore_Queue_Task_Model::ensureTable(), enqueue() или executeNext().
Если таблица уже существует, ensureTable() добавляет недостающие поля.
Основная модель: Skynetcore_Queue_Task_Model.
Поля очереди
Ключевые поля таблицы:
status-pending,processing,done,error.class_name- имя класса-исполнителя задачи.params_json- параметры задачи JSON-строкой.result_json- результат выполнения.error- текст ошибки.priority- приоритет, большее значение выполняется раньше.attempts- количество попыток выполнения.max_attempts- лимит попыток.user_id- авторизованный пользователь HostCMS/API.siteuser_id- авторизованный пользователь сайта.file_name- имя файла-источника, если задача создана из загрузки.common- общий признак для группировки/фильтрации задач, например страна склада.
Класс задачи
Исполнитель задачи должен наследоваться от Skynetcore_Queue_Task_Base и иметь
метод execute().
Пример:
class Skynetcore_Queue_Task_Null extends Skynetcore_Queue_Task_Base
{
public function execute()
{
return [
'status' => 'OK',
'params' => $this->getParams(),
];
}
}
Постановка задачи
$params = [
'example' => 'value',
];
$oTask = Skynetcore_Queue_Task_Model::enqueue(
'Skynetcore_Queue_Task_Null',
json_encode($params, JSON_UNESCAPED_UNICODE),
[
'priority' => 0,
'max_attempts' => 3,
'user_id' => 0,
'siteuser_id' => 0,
'file_name' => '',
'common' => 'Россия',
]
);
params_json должен быть валидной JSON-строкой объекта или массива.
class_name проверяется: класс должен существовать и наследоваться от
Skynetcore_Queue_Task_Base.
Фиксация ошибочной строки без выполнения
Если задачу нужно записать как факт ошибки и не выполнять повторно, используется
enqueueFailed().
Skynetcore_Queue_Task_Model::enqueueFailed(
'Skynetcore_Queue_Task_Null',
json_encode(['row' => 12], JSON_UNESCAPED_UNICODE),
'Строка 12: некорректные данные',
[
'file_name' => 'import.xlsx',
'common' => 'Россия',
]
);
Такая задача создается со статусом error, а attempts сразу равен
max_attempts, поэтому executeNext() ее повторно не возьмет.
Выполнение задач
Выполнить следующую доступную задачу:
$result = Skynetcore_Queue_Task_Model::executeNext();
executeNext() выбирает:
- задачи со статусом
pending; - задачи со статусом
error, еслиattempts < max_attempts.
Порядок выбора: priority DESC, затем id ASC.
Выполнить конкретную задачу:
$oTask = Core_Entity::factory('Skynetcore_Queue_Task')->getById($taskId, false);
$result = $oTask->execute();
Перед долгим выполнением задач из web-запроса рекомендуется закрывать сессию, чтобы не блокировать следующие запросы пользователя:
Core_Session::close();
$result = Skynetcore_Queue_Task_Model::executeNext();
API
Маршрут очереди подключен в modules/skynetcore/module.php:
/skynet/queue/{action}/
Добавление задачи:
POST /skynet/queue/add/
Тело запроса:
{
"class": "Skynetcore_Queue_Task_Null",
"params": {
"example": "value"
},
"priority": 0,
"max_attempts": 3,
"file_name": "import.xlsx",
"common": "Россия"
}
Выполнение задачи:
POST /skynet/queue/execute/
Если передать id, будет выполнена конкретная задача. Если id не передан,
будет выполнена следующая задача из очереди.
Авторизация API использует токены модуля HostCMS API. Токен можно передавать:
Authorization: Bearer <token>X-Restapi-Token: <token>- параметром
token
Пример: перенос товара между складами
Задача переноса товара реализована классом:
Bestos_Zveri_Box_Queue_Task_Good_Move
Пример параметров:
{
"zveri_goods_id": 11285,
"box_from": 1,
"box_to": 3,
"supply_marker": {
"946": {
"to_shipment": 10
}
},
"comment": "Переезд на Патвер"
}
supply_marker имеет структуру:
supply_id => marker => quantity
При переносе товар списывается с указанного маркера и приходит на другой склад на тот же маркер.