Планировщик задач PHP: cron-подобный менеджер очередей на PHP

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Планировщик задач 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
]);

Расширенная конфигурация

Библиотека поддерживает дополнительные параметры для каждой задачи:

    <

Рекомендаций