Содержание...

Webasyst Cron

Регулярное выполнение повторяющихся заданий без участия пользователя.

Сервис Webasyst Cron позволяет вашему приложению выполнять периодически повторяющиеся действия без участия пользователя (например, синхронизацию данных, удаление неактуального кеша, рассылку уведомлений и т. п.). Это избавляет от необходимости вручную настраивать серверный планировщик в панели управления хостингом.

Сервис доступен, только если в системных настройках активировано подключение к Webasyst ID.

Как это работает

  1. Ваше приложение активирует задание с указанной периодичностью: отправляет специальный запрос в сервис Webasyst Cron.

    Это аналог ручной настройки задания для серверного планировщика в контрольной панели хостинга.
  2. Webasyst Cron регулярно отправляет HTTP-запросы в аккаунт пользователя, где фреймворк Webasyst передаёт эти запросы на обработку PHP-классам заданий, реализованным в вашем приложении.

    Это аналог выполнения настроенного задания обычным серверным планировщиком.
  3. Если нужно прекратить выполнение задания, нужно отправить другой запрос в сервис Webasyst Cron — указанное задание будет удалено из списка активных.

    Это аналог удаления задания планировщика вручную в контрольной панели.

1. Создайте файл конфигурации

Создайте файл конфигурации lib/config/cron.php в исходном коде вашего продукта. В нём опишите расписание и параметры периодически выполняемых заданий:

return [
    'job-1' => [
        'expression' => '*/6 * * * *',    // выполнять каждые 6 минут
        'action' => 'example'    // идентификатор задания (job_id)
    ],
    'job-2' => [
        'expression' => '* * * * *',    // выполнять каждую минуту
        'action' => 'other',    // идентификатор задания (job_id)
        'params' => [    // дополнительные параметры для выполнения задания
            'foo' => 'bar'
        ]
    ],
    // ...
];

Параметры конфигурации заданий

  • expression

    Строка периодичности в стандартном формате Cron.

  • action

    Уникальный идентификатор задания в рамках продукта.

  • params

    Необязательный ассоциативный массив параметров, передаваемый в PHP-класс задания.

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

2. Создайте PHP-классы заданий

Логика выполнения каждого задания должна быть реализована в отдельном классе:

  • Имя файла: [app_id][Job_id].cron.php.
  • Имя класса: [app_id][Job_id]Cron.
  • Базовый класс: должен наследоваться от системного класса waCronExecutor.

Точка входа для выполнения любого задания — публичный метод execute($params).

Пример

<?php

class myappExampleCron extends waCronExecutor
{
    /**
    * @param array $params Значение элемента 'params' из cron.php
    */
    public function execute($params)
    {
        // Ваша бизнес-логика
        $foo = $params['foo'] ?? null;
    }
}

3. Реализуйте управление заданиями

Для отправки запросов к сервису Webasyst Cron используется системный класс waServicesApi, который возвращает объект installerServicesApi со следующими публичными методами:

  • schedule

    Активирует задание.

  • deleteJob

    Удаляет задание.

  • getJobs

    Возвращает список активных заданий.

Чтение конфигурации заданий приложения

Используйте вызов системного метода:

wa([app_id])->getConfig()->getCron()

public function schedule ($cron_expression, $action, $app_id)

Активирует задание приложения.

Параметры

  • $cron_expression

    Строка с указанием периодичности выполнения задания в стандартном формате Cron.

  • $action

    Идентификатор задания.

  • $app_id

    Идентификатор приложения.

Пример

$cron_config = wa($app_id)->getConfig()->getCron();

$cron_action = '...';    // job_id

/** @var installerServicesApi */
$api = new waServicesApi();

$result = $api->schedule(
    $cron_config[$cron_action]['expression'],
    $cron_action,
    wa()->getApp()
);

public function deleteJob ($action, $app_id)

Удаляет задание приложения.

Параметры

  • $action

    Идентификатор задания.

  • $app_id

    Идентификатор приложения.

Пример

/** @var installerServicesApi */
$api = new waServicesApi();
$result = $api->deleteJob($cron_action, wa()->getApp());

public function getJobs ($app_id)

Возвращает список активных заданий приложения.

Параметры

  • $app_id

    Идентификатор приложения.

Пример

/** @var installerServicesApi */
$api = new waServicesApi();
$result = $api->getJobs(wa()->getApp());

Как активировать задание вручную (в контрольной панели хостинга)

Если нужно обойтись без вызова системного метода schedule().

Для этого настройте задание серверного планировщика с командой вида

php cli.php --cron [app_id] [job_id]