Планировщик задач PHP: управление периодическими задачами в коде
В современной веб-разработке часто возникает необходимость выполнять повторяющиеся действия: отправка email-рассылок, очистка кэша, генерация отчётов, синхронизация данных с внешними API. Традиционно для этого используется системный cron (crontab), но он требует доступа к shell и настройки на сервере. Библиотека Планировщик задач PHP (Task Scheduler) позволяет реализовать cron-подобное поведение непосредственно в PHP-приложении, без необходимости редактировать crontab. Это идеальное решение для shared-хостинга, контейнерных сред (Docker) или проектов, где нужна гибкая логика планирования из кода.
Основные возможности
Библиотека предоставляет fluent-интерфейс для определения задач и их расписания. Ключевые функции:
- Гибкое определение расписания – поддержка выражений cron, интервалов (каждые N минут, часов, дней), конкретного времени (ежедневно в 03:00).
- Выполнение команд и callback-функций – можно запускать shell-команды, методы классов или анонимные функции.
- Управление очередями – интеграция с очередями (например, RabbitMQ, Redis) для отложенного выполнения.
- Логирование и уведомления – встроенная поддержка логов выполнения, отправка ошибок по email или в Sentry.
- Безопасность – предотвращение параллельного запуска одной и той же задачи (mutex).
Установка и настройка
Установка производится через Composer:
composer require vendor/task-scheduler
После установки необходимо создать файл scheduler.php, который будет запускаться по системному cron (один раз в минуту). Внутри файла настраиваются все задачи:
<?php
require_once __DIR__ . '/vendor/autoload.php';
use Scheduler\Scheduler;
use Scheduler\Task;
$scheduler = new Scheduler();
// Задача 1: очистка кэша каждые 30 минут
$scheduler->add(new Task('cache:clear', function() {
// Логика очистки кэша
echo "Cache cleared at " . date('Y-m-d H:i:s') . PHP_EOL;
}), '*/30 * * * *');
// Задача 2: отправка email-рассылки каждый день в 9:00
$scheduler->add(new Task('send:newsletter', 'php artisan newsletter:send'), '0 9 * * *');
// Задача 3: обновление статистики каждые 5 минут, но не чаще 1 раза в 10 минут
$scheduler->add(new Task('update:stats', function() {
// Долгая операция
sleep(5);
}), '*/5 * * * *', [
'mutex' => true, // защита от параллельного запуска
'timeout' => 300 // максимальное время выполнения (5 минут)
]);
$scheduler->run();
?>
В системном crontab добавляется строка:
* * * * * php /path/to/scheduler.php >> /dev/null 2>&1
Теперь PHP-скрипт будет запускаться каждую минуту и проверять, какие задачи нужно выполнить.
Примеры использования
1. Простой планировщик с callback
<?php
$scheduler->add(new Task('greet', function() {
echo "Hello, World!";
}), '*/1 * * * *'); // Каждую минуту
2. Запуск Artisan-команды Laravel
<?php
$scheduler->add(new Task('reports:generate', 'php artisan reports:generate --force'), '0 2 * * 1'); // Каждый понедельник в 2:00
3. Использование интервалов вместо cron
<?php
use Scheduler\Interval;
$scheduler->add(new Task('backup:db', 'mysqldump -u root db > backup.sql'), Interval::everyHour());
// или
$scheduler->add(new Task('cleanup:logs', 'rm -rf /var/log/old/*'), Interval::everyDays(7));
4. Отложенное выполнение через очередь
<?php
$scheduler->add(new Task('process:payments', function() use ($queue) {
$queue->push(new ProcessPaymentJob());
}), '*/10 * * * *', [
'queue' => 'redis' // задача будет отправлена в очередь Redis
]);
Расширенная конфигурация
Библиотека поддерживает дополнительные параметры для каждой задачи:
-
<