Планировщик задач PHP: библиотека cron‑expression
При разработке веб‑приложений на PHP часто возникает необходимость выполнять определённые действия по расписанию: отправлять уведомления, очищать кеш, генерировать отчёты или синхронизировать данные. Встроенный cron в Linux — мощный инструмент, но его настройка требует доступа к серверу и не всегда удобна для динамического планирования внутри PHP‑кода. Библиотека cron‑expression решает эту задачу — она позволяет парсить, проверять и вычислять время выполнения задач на основе CRON‑выражений прямо в PHP.
В этой статье мы разберём, как установить и использовать библиотеку cron‑expression, напишем простой планировщик задач и рассмотрим примеры с реальными сценариями.
Что такое cron‑expression?
cron‑expression — это PHP-библиотека для работы с CRON-выражениями. CRON-выражение — это строка, состоящая из пяти полей, разделённых пробелами:
* * * * *
| | | | |
| | | | +---- день недели (0–7) (воскресенье = 0 или 7)
| | | +------ месяц (1–12)
| | +-------- день месяца (1–31)
| +---------- час (0–23)
+------------ минута (0–59)
Например, выражение 30 4 * * 1-5 означает: «каждые будни в 4:30 утра». Библиотека позволяет:
- Проверять, подходит ли текущее время под заданное выражение.
- Получать следующую дату выполнения задачи.
- Вычислять предыдущую дату выполнения.
- Работать с диапазонами, шагами и списками значений.
Установка
Установка выполняется через Composer. Откройте терминал в корне вашего проекта и выполните:
composer require mtdowling/cron-expression
После установки подключите автозагрузку Composer в вашем PHP‑скрипте:
require 'vendor/autoload.php';
Основные возможности и примеры
1. Проверка текущего времени
Допустим, мы хотим выполнять задачу каждые 15 минут. CRON-выражение: */15 * * * *. Создадим объект и проверим, нужно ли запускать задачу прямо сейчас:
<?php
use Cron\CronExpression;
$expression = CronExpression::factory('*/15 * * * *');
if ($expression->isDue()) {
echo "Задача должна быть выполнена сейчас!";
} else {
echo "Время ещё не пришло.";
}
?>
Метод isDue() проверяет, совпадает ли текущее время с выражением. По умолчанию используется часовой пояс сервера.
2. Получение следующей даты выполнения
Иногда нужно заранее знать, когда запустится задача:
<?php
use Cron\CronExpression;
$expression = CronExpression::factory('0 6 * * 1-5'); // каждый будний день в 6:00
$nextRun = $expression->getNextRunDate();
echo "Следующий запуск: " . $nextRun->format('Y-m-d H:i:s');
?>
Результат: Следующий запуск: 2025-03-10 06:00:00 (если сегодня пятница, то следующий понедельник).
3. Предыдущая дата выполнения
Метод getPreviousRunDate() возвращает последний момент, когда условие выполнялось:
<?php
$prevRun = $expression->getPreviousRunDate();
echo "Предыдущий запуск: " . $prevRun->format('Y-m-d H:i:s');
?>
4. Работа с часовыми поясами
По умолчанию используется часовой пояс сервера, но вы можете задать свой:
<?php
$expression = CronExpression::factory('0 9 * * *');
$expression->setTimezone(new DateTimeZone('Europe/Moscow'));
if ($expression->isDue()) {
echo "В Москве сейчас 9:00 — пора действовать!";
}
?>
Создание простого планировщика задач
Теперь соберём всё вместе и напишем небольшой класс, который будет выполнять задачи по расписанию. Предположим, у нас есть список задач с CRON‑выражениями и колбэками.
<?php
class TaskScheduler
{
private $tasks = [];
public function addTask(string $cronExpression, callable $callback): void
{
$this->tasks[] = [
'expression' => CronExpression::factory($cronExpression),
'callback' =>