Розклад описується в PHP, а не в crontab - тож він лежить у git разом із кодом.
Опис завдання у routes/console.php:
use Illuminate\Support\Facades\Schedule;
Schedule::command('vacancies:parse')->twiceDaily(6, 18);
Schedule::command('reports:send')->dailyAt('09:00');
Schedule::job(new CleanupTempFiles)->hourly();
Що потрібно на сервері - один запис у cron:
* * * * * cd /path-to-project && php artisan schedule:run >> /dev/null 2>&1
Саме так: щохвилини й один рядок на весь застосунок. Cron будить Laravel щохвилини, а той сам вирішує, чиє зараз час. Новий пункт розкладу не потребує змін у cron.
Перевірити, не чекаючи часу:
php artisan schedule:list # що і коли має виконатися
php artisan schedule:run # виконати те, чому час зараз
php artisan schedule:work # тримати планувальник локально, без cron
Типові помилки новачка:
- Прописати кожне завдання окремим рядком у crontab - тоді розклад із коду не працює зовсім.
- Забути
cdу шлях проєкту: команда не знайде застосунок. - Запускати від імені іншого користувача, ніж веб-сервер, - права на
storageне збігаються, і завдання падає на записі логу. - Не дивитися на вивід: без
emailOutputOnFailure()чи логування падіння завдання непомітне.