skynet/core-module

Core module for HostCMS

Maintainers

Package info

gitlab.com/hostcms/skynet/core-module

Issues

Type:hostcms-module

pkg:composer/skynet/core-module

Statistics

Installs: 1 182

Dependents: 0

Suggesters: 0

Stars: 0

dev-master 2026-05-13 16:37 UTC

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

При переносе товар списывается с указанного маркера и приходит на другой склад на тот же маркер.