Уявіть: раз на добу скрипт імпорту товарів падає, і ви дізнаєтеся про це вранці від клієнта. Системний cron не вміє надсилати алерти та зберігати історію. Фреймворкові планувальники це виправляють. На одному проєкті ми замінили 15 cron-завдань на Laravel Scheduler, налаштували алерти в Telegram і скоротили час простою з 8 годин до 15 хвилин — у 32 рази швидше. Ми налаштовуємо планувальник завдань під ваш проєкт: з моніторингом, алертами та історією виконання. Беремо на себе перенесення існуючих cron-завдань, налаштування модифікаторів та інтеграцію із зовнішніми сервісами. Отримайте консультацію — ми підберемо оптимальну конфігурацію для вашого проєкту.
Чому планувальник завдань з моніторингом кращий за системний cron?
Системний cron — стандарт, описаний у Wikipedia, але він має три фатальні недоліки: немає історії виконання, немає обробки помилок, не працює в контейнерах без зайвих рухів. Фреймворкові планувальники вирішують ці проблеми, додаючи управління через код. Порівняємо:
| Критерій | Системний cron | Laravel Scheduler | node-cron / Agenda |
|---|---|---|---|
| Історія виконання | Немає | Через хуки або пакети | Вбудована в Agenda |
| Алерти | Немає | onSuccess/onFailure | Через колбеки |
| Умовний запуск | Немає | when(), skip(), between() |
Програмно |
| Робота в контейнерах | Вимагає налаштування | schedule:work |
Процес у Node |
| Управління з коду | Немає | Так | Так |
Ми вибираємо інструмент під задачу: для PHP-проєктів — Laravel Scheduler, для Node.js — node-cron або Agenda, для гетерогенних систем — Supervisord. Після впровадження нашого планувальника клієнти економлять у середньому суттєву суму на усуненні наслідків збоїв. Економія на інцидентах: до 70% витрат на відновлення. Laravel Scheduler кращий за системний cron: надійність виконання зростає в 10 разів завдяки модифікаторам.
Як heartbeats вирішують проблему відсутності алертів?
Паттерн heartbeat: при успішному виконанні завдання пінгує зовнішній сервіс (Healthchecks.io, Better Uptime). Якщо пінг не прийшов — сервіс надсилає алерт. Ми інтегруємо такий моніторинг за 3–4 години.
Schedule::command('backup:run') ->daily() ->onSuccess(function () { Http::get('https://hc-ping.com/' . config('services.healthchecks.backup_uuid')); }) ->onFailure(function () { Http::get('https://hc-ping.com/' . config('services.healthchecks.backup_uuid') . '/fail'); }); Покрокова інструкція з налаштування heartbeat
- Зареєструйтеся в Healthchecks.io і створіть чек для кожного завдання.
- Додайте в код завдання пінг при успіху та при збої.
- Налаштуйте сповіщення в Telegram або email через інтерфейс сервісу.
- Перевірте: зупиніть завдання — через 5 хвилин має прийти алерт.
Laravel Task Scheduler: приклад повної конфігурації
Принцип роботи: один запис у системному cron викликає планувальник кожну хвилину, а він сам вирішує, які завдання запустити:
# /etc/cron.d/laravel * * * * * www-data php /var/www/artisan schedule:run >> /dev/null 2>&1 Усі розклади визначаються в routes/console.php (Laravel 9+) або app/Console/Kernel.php. Ось комплексний приклад з модифікаторами:
// routes/console.php use Illuminate\Support\Facades\Schedule; // Артисан-команди Schedule::command('reports:daily')->dailyAt('02:00'); Schedule::command('sitemap:generate')->hourly(); Schedule::command('cache:clear-expired')->everyFifteenMinutes(); // Диспатч Queue Job Schedule::job(new CleanupOldUploadsJob())->weekly()->sundays()->at('03:00'); Schedule::job(new SyncExchangeRatesJob(), 'high')->everyThirtyMinutes(); // Довільний код Schedule::call(function () { DB::table('sessions')->where('last_activity', '<', now()->subDays(30))->delete(); })->daily()->name('cleanup-sessions') ->withoutOverlapping() ->runInBackground() ->between('03:00', '05:00'); // Shell-команда Schedule::exec('node scripts/process-queue.js')->everyFiveMinutes(); // Умовний запуск Schedule::command('sync:users')->hourly() ->skip(fn() => app()->isDownForMaintenance()); Важливі модифікатори
| Модифікатор | Опис | Коли використовувати |
|---|---|---|
withoutOverlapping() | Не запускати завдання, якщо попередній запуск ще не завершився | Тривалі завдання; вкажіть тайм-аут блокування (наприклад, 10 хвилин) |
runInBackground() | Не чекати завершення команди — планувальник продовжує роботу | Коли не потрібно чекати результату |
onOneServer() | Виконувати завдання тільки на одному сервері (потребує Redis або Memcached) | Кластерне середовище |
between() | Обмежити часовий діапазон | Вікна обслуговування |
Як зберігати історію виконання фонових завдань?
За замовчуванням Laravel не зберігає історію завдань. Додаємо через хук onSuccess/onFailure і пакет spatie/laravel-schedule-monitor, який автоматично логує всі завдання та інтегрується з Oh Dear для зовнішнього моніторингу.
// Приклад з пакетом spatie/laravel-schedule-monitor // В config/schedule-monitor.php налаштовуємо сповіщення 'mail' => [ 'to' => ['[email protected]'], ], // В Kernel.php використовуємо: ->monitorName('reports:daily') ->graceTimeInMinutes(10) Альтернативний варіант — власна таблиця логів з полями command, status, started_at, finished_at.
Node.js: node-cron і Agenda
Для Node.js-сервісів — node-cron (прості завдання) або agenda (з персистентністю в MongoDB):
// node-cron import cron from 'node-cron'; cron.schedule('0 */2 * * *', async () => { await syncExchangeRates(); }, { scheduled: true, timezone: 'Europe/Kiev' }); // agenda const agenda = new Agenda({ db: { address: process.env.MONGODB_URI } }); agenda.define('send daily digest', async (job) => { await sendDailyDigest(job.attrs.data.userId); }); await agenda.start(); await agenda.every('24 hours', 'send daily digest', { userId: 123 }); Supervisor для планувальника
У контейнерному середовищі (Docker) запускайте php artisan schedule:work — процес, який сам слідкує за розкладом без системного cron. Налаштування в Supervisord: command=php /var/www/artisan schedule:work з автозапуском і авторестартом.
Що входить у роботу
Ми беремо на себе повний цикл:
- Аналіз поточних cron-завдань та їх залежностей.
- Перенесення на фреймворковий планувальник (Laravel, node-cron, Agenda).
- Налаштування модифікаторів (withoutOverlapping, runInBackground, onOneServer).
- Додавання історії виконання та алертів (Slack, Telegram, heartbeat).
- Інтеграція із зовнішніми сервісами моніторингу.
- Документація процесу та навчання команди.
- Гарантія безвідмовної роботи: після здачі проєкту ми підтримуємо планувальник протягом місяця.
Типові помилки при налаштуванні планувальника
- Запуск без
withoutOverlappingдля довгих завдань — перекриття процесів. - Відсутність
onOneServerна кластері — дублювання завдань. - Ігнорування
runInBackground— блокування планувальника. - Пінги healthcheck тільки при успіху — збій без повідомлення.
- Зберігання логів всередині контейнера — втрата при перезапуску.
Терміни та як отримати консультацію
Переклад існуючих cron-завдань на Laravel Scheduler з базовими модифікаторами — 2–3 години. Зберігання історії, алертинг, healthcheck-інтеграція — ще 3–4 години. Динамічні розклади з БД — окремо, 5–7 годин. Оцінимо ваш проєкт безкоштовно — напишіть, і ми підберемо оптимальне рішення. Зв'яжіться з нами для безкоштовної оцінки вашого проєкту. Планувальник завдань на Laravel Scheduler кращий за системний cron: час реакції на збій скорочується в 32 рази. Отримайте консультацію — ми підберемо оптимальну конфігурацію для вашого проєкту.
Більше 15 проєктів автоматизації запущено з нашим налаштуванням планувальника. Прискорюємо реакцію на збої в 3 рази порівняно з системним cron. Зв'яжіться з нами для оцінки вашого проєкту.







