Уявіть: раз на добу скрипт імпорту товарів падає, і ви дізнаєтеся про це вранці від клієнта. Системний 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. Зв'яжіться з нами для оцінки вашого проєкту.







