Задачи по расписанию
Задача cron — код, который выполняется по расписанию, а не по запросу посетителя: обновление курсов валют, очистка старых записей, отправка отчёта. В OpenCart 4 есть свой список таких задач. Дополнение добавляет задачу в список, а системный планировщик сервера через равные промежутки «будит» магазин.
Как это работает
- Планировщик сервера раз в час открывает адрес
index.php?route=cron/cron. - Контроллер
cron/cronперебирает список задач и выбирает те, чьё время пришло. - Для каждой он вызывает контроллер, записанный в задаче.
Список виден в панели: 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. Добавьте строку на сервере и через час проверьте, что дата последнего запуска в списке изменилась.