Cron-вирази
Перевірити cron-вираз і побачити наступні запуски
Дані не залишають ваш браузер
Цей інструмент повністю працює на вашому пристрої: обчислення виконує JavaScript у вкладці. Ми не надсилаємо введений текст на сервер, не зберігаємо і не логуємо його. Можете сміливо працювати з робочими даними - і навіть відключити інтернет після завантаження сторінки.
Що це означає
Наступні запуски
Як читається cron-вираз
П'ять полів, розділених пробілами:
┌─ хвилина (0-59)
│ ┌─ година (0-23)
│ │ ┌─ день місяця (1-31)
│ │ │ ┌─ місяць (1-12)
│ │ │ │ ┌─ день тижня (0-6, 0 = неділя)
│ │ │ │ │
0 3 * * 1 о 03:00 щопонеділка
Спецсимволи: * - будь-яке значення, , - перелік (1,15), - - діапазон (9-17), / - крок (*/15 - кожні 15).
Пастка, про яку майже ніхто не знає
Коли обмежені обидва поля дня - і день місяця, і день тижня - вони працюють через АБО, а не І.
0 0 1 * 1
Це не «першого числа, якщо це понеділок», а «першого числа і щопонеділка». Якщо потрібне саме перетинання, доводиться перевіряти день у самій задачі.
Інструмент вище враховує це правило, тому список наступних запусків показує реальну поведінку, а не інтуїтивну.
Типові вирази
| Вираз | Значення |
|---|---|
* * * * * |
щохвилини |
*/15 * * * * |
кожні 15 хвилин |
0 * * * * |
щогодини рівно |
0 3 * * * |
щодня о 03:00 |
0 9 * * 1-5 |
о 09:00 у будні |
0 0 1 * * |
першого числа щомісяця |
0 0 * * 0 |
щонеділі опівночі |
У Laravel
Планувальник має власний, читабельніший синтаксис - сирий cron у ньому потрібен рідко:
// routes/console.php
Schedule::command('vacancies:check')->everyFifteenMinutes();
Schedule::command('report:daily')->dailyAt('03:00');
Schedule::command('digest:weekly')->weeklyOn(1, '09:00');
// Але сирий вираз теж приймається
Schedule::command('sync')->cron('0 3 * * 1');
Головне: у crontab потрібен лише один запис - той, що запускає планувальник щохвилини. Далі Laravel сам вирішує, чиї задачі час виконувати.
* * * * * cd /path && php artisan schedule:run >> /dev/null 2>&1
Чотири речі, які варто додати до задач
Schedule::command('report:heavy')
->dailyAt('03:00')
->withoutOverlapping() // попередній запуск ще йде - не стартувати новий
->onOneServer() // кілька серверів - виконає лише один
->runInBackground() // не блокує решту розкладу
->timezone('Europe/Kyiv');
withoutOverlapping() рятує від класичної аварії: важка задача не встигає за інтервал, запуски накопичуються і кладуть сервер.
Пояс варто задавати явно для всього, що прив'язане до людського часу - інакше перехід на літній час зсуне «щоденну о 9:00» звітність (див. Unix timestamp про київський зсув).
Перевірка розкладу
php artisan schedule:list # що і коли запуститься
php artisan schedule:run # виконати те, що припадає на зараз
php artisan schedule:test # запустити конкретну задачу вручну
- Де виконується
- у браузері
- Категорія
- Час і розклад