Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Задачи по расписанию

Задача cron — код, который выполняется по расписанию, а не по запросу посетителя: обновление курсов валют, очистка старых записей, отправка отчёта. В OpenCart 4 есть свой список таких задач. Дополнение добавляет задачу в список, а системный планировщик сервера через равные промежутки «будит» магазин.

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

  1. Планировщик сервера раз в час открывает адрес index.php?route=cron/cron.
  2. Контроллер cron/cron перебирает список задач и выбирает те, чьё время пришло.
  3. Для каждой он вызывает контроллер, записанный в задаче.

Список виден в панели: Extensions → Cron Jobs. У каждой задачи есть цикл — hour, day или month.

Контроллер задачи

Задача — контроллер витрины в дополнении. Создайте его вручную:

// extension/acme_hello/catalog/controller/cron/cleanup.php
namespace Opencart\Catalog\Controller\Extension\AcmeHello\Cron;
 
class Cleanup extends \Opencart\System\Engine\Controller
{
    public function index(int $cron_id, string $code, string $cycle, string $date_added, string $date_modified): void
    {
        $this->db->query(
            "DELETE FROM `" . DB_PREFIX . "acme_callback`
             WHERE `date_added` < DATE_SUB(NOW(), INTERVAL 30 DAY)"
        );
 
        $this->log->write('Acme Hello: удалено старых заявок: ' . $this->db->countAffected());
    }
}

Задача удаляет заявки на звонок старше 30 дней и пишет в журнал число удалённых строк. Аргументы — поля задачи; ядро передаёт их при каждом вызове.

Регистрация

Задачу добавляют в install() контроллера панели и удаляют в uninstall():

// extension/acme_hello/admin/controller/module/acme_hello.php
public function install(): void
{
    $this->load->model('setting/cron');
 
    $this->model_setting_cron->addCron('acme_hello_cleanup', 'Удаляет старые заявки на звонок', 'day', 'extension/acme_hello/cron/cleanup', true);
}
 
public function uninstall(): void
{
    $this->load->model('setting/cron');
 
    $this->model_setting_cron->deleteCronByCode('acme_hello_cleanup');
}
АргументСмысл
ПервыйУникальный код задачи
ВторойОписание для списка
ТретийЦикл: hour, day, month
ЧетвёртыйМаршрут контроллера задачи
ПятыйВключена ли задача

Способ передачи аргументов в addCron() различается между выпусками — проверьте метод в admin/model/setting/cron.php своей копии. Переустановите модуль — задача появится в Extensions → Cron Jobs.

Системный планировщик

На сервере добавьте строку в crontab — таблицу расписания Linux:

0 * * * * curl -s "https://shop.example.com/index.php?route=cron/cron" > /dev/null

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

Проверка

Откройте http://shop.test/index.php?route=cron/cron в браузере вручную, а затем System → Maintenance → Error Logs — в журнале есть строка задачи. Ежедневная задача выполнится снова только через сутки; время последнего запуска видно в списке задач.

Частая ошибка

Задача зарегистрирована, но ничего не происходит. Список в панели сам ничего не запускает: без строки в системном crontab никто не открывает cron/cron. Добавьте строку на сервере и через час проверьте, что дата последнего запуска в списке изменилась.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.