Mi az a Task scheduling?
A Task Scheduling (feladatütemezés) egy olyan folyamat, amely lehetővé teszi a programozók számára, hogy különböző időpontokban automatikusan futtassanak feladatokat, például adatbázis frissítést, adatexportot vagy bármilyen más olyan feladatot, amely ismétlődően vagy rendszeresen elvégzendő. Under the hood a laravel crontab-et használ.
Mi az a crontab?
A crontab egy olyan eszköz a Unix rendszereken (például a Linux-on), amely lehetővé teszi a felhasználók számára, hogy időzítsék az ismétlődő feladatokat. A crontab egy rövidítés a "cron table" szóból, amely magába foglalja az összes felhasználói cron munkát a rendszeren.
A crontab fájl egy szöveges fájl, amely tartalmazza a cron ütemezőrendszert. Ez a fájl tartalmazza az összes cron munkát és a cron munkák időzítését. A fájlban az ismétlődő feladatokat speciális cron kifejezésekkel lehet beállítani.
A cron kifejezések tartalmaznak információkat a feladatok időzítéséről, például a perc, az óra, a nap, a hónap és a hét napjai, amikor a feladatot futtatni kell.
A crontab fájlt a crontab -e
parancs segítségével lehet szerkeszteni. A crontab -l
parancs listázza a felhasználó crontab fájljának tartalmát, míg az crontab -r
parancs törli a felhasználó crontab fájlját.
Páldául minden percben lefutó parancsok:
* * * * * php -v
* * * * * cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1
Az első csillag a perc, a második az óra, a harmadik a nap (a hónapban), a negyedik a hónap és az utolsó a nap (a héten). A csillag minden értéket jelent, vesszővel elválasztva fel lehet sorolni pl. számokat, kötőjellel intervallumot és per jellel pedig lépésközöket lehet megadni.
Időzítésre még több példa: https://crontab.guru/#*_*_*_*_*
Ha nem lenne Task schedule
Az összes Laravel parancsot kézzel kéne beletenni a crontabba
* * * * * cd /path-to-your-project && php artisan pending-transactions:check' >> /dev/null 2>&1
* * * * * cd /path-to-your-project && php artisan archive >> /dev/null 2>&1
0 * * * * cd /path-to-your-project && php artisan check:horizon >> /dev/null 2>&1
…
Ez nagyon gyorsan átláhatatlan válna és nem lehetne rendesen verzió kezelni sem.
Ehelyett a projekt indításakor csak ezt az egy parancsot kell beletenni:
* * * * * php artisan schedule:run >> /dev/null 2>&1
Ez minden percben lefog futni és elfogja dönteni a Laravel Console Kernel alapján, hogy milyen parancsokat kell futtatni.
Laravel Task Schedule
A Laravel-ben Task Scheduler használata rendkívül egyszerű. Először meg kell nyitni a app/Console/Kernel.php
fájlt. Ez a fájl tartalmazza a Scheduler beállításait.
A schedule
metódus felelős az ismétlődő feladatok ütemezéséért. A következő példa bemutatja, hogyan lehet beállítani a Task Schedule-t a minden nap futó backuphoz:
protected function schedule(Schedule $schedule)
{
$schedule->command('backup:run')->daily();
}
A Schedule
osztály képes meghívni Laravel artisan parancsokat, akár sztringként, akár osztályként.
$schedule->command('emails:send Xtra --force')->daily();
$schedule->command(SendEmailsCommand::class, ['Xtra', '--force'])->daily();
Továbbá lehet vele Job osztályokat is futtatni.
$schedule->job(new Heartbeat)->everyFiveMinutes();
Illetve akár az alkalmazáson kivűli parancsokat, scripteket is:
$schedule->exec('node script.js')->hourly();
Artisan parancsok
A legfőbb artisan parancs az a php artisan schedule:run
ez az amit bele kell tenni a crontab fájlba. Ez fog minden percben lefutni és ez fogja eldönteni, hogy miket kell abban az adott percben futtatni a schedule
metódusból.
A list parancs kilistázza ebben a metódusban található összes ütemezési feladatot, illetve azt, hogy mikor fog legközelebb futni.
php artisan schedule:list
A work parancsall lehet tesztelni ezt a metódust, a konzolban elindul egy daemon, ami percenként lefogja futtatni a schedulert, és az elfogja dönteni, hogy éppen minek kell futnia.
php artisan schedule:work
A test parancsall pedig egy-egy ütemezési feladatot lehet konkrétan futattni.
php artisan schedule:test
Időzítések
Meglehet adni a már korábban említett csillagokat is teljesen egyedi értékekhez:
->cron('* * * * *');
Illetve vannak még beszédes metódusok is, például:
->everyMinute();
->everyTwoMinutes();
->daily();
->dailyAt('13:00')
->hourly();
->hourlyAt(17);
->everyOddHours();
->weekly();
Még több példa: https://laravel.com/docs/9.x/scheduling#schedule-frequency-options
Egyéb fontos metódusok
->withoutOverlapping();
->evenInMaintanceMode();
->runInBackground();
A without overlapping azért felel, hogy egy parancs ne tudjon többször elindulni. Például ha egy email küldés parancs lefut minden percben de nagyon sok az email mennyiség amit ki kell küldeni akkor több percig is futhat és akkor nem szeretnénk, hogy többször is elinduljon abban a pár percben.
Az even in maintance mode az elég beszédes, azt jelenti, hogy ha a karbantartási mód bevan kapcsolva az oldalon, akkor is lefog futni a parancs.
A run in background pedig a parancsok háttérben való futattását jelenti. Ez talán a leghasznossabb mert ha nagyon sok parancs van a schedule-ben, amiknek például minden percben lekell futnia de a legelső parancs valamiért sokáig tart, akkor az összes többi parancs utána már nem biztos, hogy letud futni abban a percben.
És hogy hogyan kapcsolódik majd ez az egész a Queuek-hoz és a Horizonhoz ? Hamarosan egy új blog posztban megírom :)