Cron / Планировщик задач (Schedule)
Внимание
Данная статья документации написана нейросетью. Возможны некоторые расхождения и неточность информации!
Обзор
IO7 имеет встроенный планировщик cron задач. Задачи определяются в таблице cron и выполняются через php iocli schedule:run.
Архитектура
Модели данных (IO\Classes)
| Модель | Таблица | Описание |
|---|---|---|
CronJob | cron | Определения cron задач |
CronWork | cron_work | Логи выполнения |
CronData | cron_data | Хранилище данных задач |
Шаблон задач (IO\Console\ScheduleTemplate)
Базовый класс для cron задач. Наследуется в app/Crons/.
<?php
declare(strict_types=1);
namespace App\Crons;
use IO\Console\ScheduleTemplate;
class CleanUpCron extends ScheduleTemplate
{
public function cron_ask(): bool
{
// Возвращает true если задача должна выполниться
$this->data_load();
return true;
}
public function cron_do(): void
{
// Основная логика
$this->data['counter'] = ($this->data['counter'] ?? 0) + 1;
$this->data_save();
}
}
Методы ScheduleTemplate
| Метод | Описание |
|---|---|
cron_ask(): bool | Проверка условий запуска |
cron_do(): void | Основная логика |
data_load(): void | Загрузить данные из cron_data |
data_save(): void | Сохранить данные в cron_data |
terminate() | Остановить выполнение |
isTerminated(): bool | Проверить флаг остановки |
timestamp_begin() | Начать замер времени |
timestamp_write() | Записать промежуточную метку |
work_begin() | Начать работу (бюджет времени) |
work_end() | Завершить работу |
ask_end(): bool | Проверить превышение бюджета |
Свойства
| Свойство | Тип | Описание |
|---|---|---|
$data | array | Данные задачи (для data_save/load) |
$datakey | string | Ключ в cron_data |
$db | object|null | Подключение к БД |
$work_id | int | ID текущего выполнения в cron_work |
$work_time | float | Бюджет времени |
$timestamps | array | Метки времени |
Таблица cron
| Поле | Тип | Описание |
|---|---|---|
id | BIGINT PK | ID |
file | VARCHAR(255) UNIQUE | Путь к файлу |
classname | VARCHAR(255) UNIQUE | Имя класса |
enable | TINYINT(1) | Включена |
time_period | INT | Период запуска (сек) |
max_threads | INT | Макс. потоков |
time_work | INT | Бюджет времени (сек) |
description | TEXT | Описание |
last_run | DATETIME | Последний запуск |
Таблица cron_work
| Поле | Тип | Описание |
|---|---|---|
id | BIGINT PK | ID |
cron_id | BIGINT FK → cron.id | ID задачи |
status | VARCHAR(255) | DO / DONE / FAILED |
time_begin | DATETIME | Начало |
time_end | DATETIME | Конец |
log | LONGTEXT | Лог |
timestamps | LONGTEXT | Метки |
avg | DOUBLE | Среднее время |
count | DOUBLE | Количество |
Таблица cron_data
| Поле | Тип | Описание |
|---|---|---|
key | VARCHAR(255) PK | Ключ |
data | TEXT | Сериализованные данные |
CLI команды
php iocli schedule:run # Выполнить все due задачи
php iocli schedule:run --id=3 # Выполнить конкретную по ID
php iocli schedule:list # Список активных задач
php iocli schedule:status # Статистика (running/done/failed)
Расписание
Расписание cron задач настраивается в таблице cron напрямую. Задачи с enable=1 запускаются при schedule:run.
Планировщик внешний (системный crontab):
# Каждую минуту
* * * * * cd /var/www/php && php iocli schedule:run >> /var/log/cron.log 2>&1
Сервис: ScheduleService
IO\Console\Services\ScheduleService — центральный сервис:
| Метод | Описание |
|---|---|
getDueJobs() | Получить задачи для запуска |
runJob(int $cronId) | Запустить по ID |
runJobByClass(string $class) | Запустить по имени класса |
getStats() | Статистика {total, running, completed, failed} |
Пример: DeleteCron
<?php
declare(strict_types=1);
namespace App\Crons;
use IO\Console\ScheduleTemplate;
class DeleteCron extends ScheduleTemplate
{
public function cron_ask(): bool
{
return true;
}
public function cron_do(): void
{
$date = iogetdbtimeutc(floor(time() / 86400) * 86400 - 7 * 24 * 60 * 60);
$this->app()->iodb->delete('cron_work', [
'<=time_begin' => $date,
]);
}
}