• Esittely
  • Aikataulujen määrittäminen
    • Artisan-käskyjen aikataulutus
    • Oriviin asetettujen töiden aikataulutus
    • Kuoren komentojen aikataulutus
    • Aikataulujen taajuusvaihtoehdot
    • Aikavyöhykkeet
    • Aikataulukot
    • Tehtävien päällekkäisyyksien ehkäiseminen
    • Tehtävien suorittaminen yhdellä palvelimella
    • Taustatehtävät
    • Huoltotila
  • Ajoitusohjelman suorittaminen
    • Ajoitusohjelman suorittaminen paikallisesti
  • Tehtävien tulostaminen
  • Tehtäväkoukut

Itutustuminen

Viime aikoina, olet ehkä kirjoittanut cron-konfiguraatiomerkinnän jokaista tehtävää varten, jonka olet halunnut ajoittaa palvelimellesi. Tästä voi kuitenkin tulla nopeasti hankalaa, koska tehtäväaikataulusi ei ole enää lähdekoodin hallinnassa ja sinun on päästävä SSH-yhteydellä palvelimeesi katsomaan olemassa olevia cron-merkintöjäsi tai lisäämään uusia merkintöjä.

Laravelin komentoaikatauluohjelma tarjoaa uudenlaisen lähestymistavan palvelimesi ajoitettujen tehtävien hallintaan. Aikatauluttajan avulla voit määritellä komentojen aikataulun sujuvasti ja ilmeikkäästi itse Laravel-sovelluksessasi. Kun käytät ajastinta, palvelimellasi tarvitaan vain yksi cron-merkintä. Tehtäväaikataulusi määritellään app/Console/Kernel.php-tiedoston schedule-metodissa. Alkuun pääsemisen helpottamiseksi metodin sisällä on määritelty yksinkertainen esimerkki.

Aikataulujen määrittäminen

Voit määritellä kaikki ajoitetut tehtävät sovelluksesi App\Console\Kernel-luokan schedule-metodissa. Tarkastellaan aluksi esimerkkiä. Tässä esimerkissä ajastamme sulkemisen kutsuttavaksi joka päivä keskiyöllä. Sulkeuman sisällä suoritamme tietokantakyselyn taulukon tyhjentämiseksi:

<?phpnamespace App\Console;use Illuminate\Console\Scheduling\Schedule;use Illuminate\Foundation\Console\Kernel as ConsoleKernel;use Illuminate\Support\Facades\DB;class Kernel extends ConsoleKernel{ /** * The Artisan commands provided by your application. * * @var array */ protected $commands = ; /** * Define the application's command schedule. * * @param \Illuminate\Console\Scheduling\Schedule $schedule * @return void */ protected function schedule(Schedule $schedule) { $schedule->call(function () { DB::table('recent_users')->delete(); })->daily(); }}

Sulkeumien avulla tapahtuvan ajoituksen lisäksi voit ajoittaa myös kutsuttavia objekteja. Kutsuttavat objektit ovat yksinkertaisia PHP-luokkia, jotka sisältävät __invoke-metodin:

$schedule->call(new DeleteRecentUsers)->daily();

Jos haluat tarkastella yleiskatsausta ajoitetuista tehtävistäsi ja niiden seuraavasta ajoitetusta suorittamisajankohdasta, voit käyttää schedule:list Artisan-komentoa:

php artisan schedule:list

Artisan-komentojen ajoittaminen

Sulkujen ajoittamisen lisäksi voit ajoittaa myös Artisan- ja järjestelmäkomentoja. Voit esimerkiksi käyttää command-menetelmää Artisan-komennon ajoittamiseen joko komennon nimen tai luokan avulla.

Kun ajoitat Artisan-komentoja komennon luokan nimen avulla, voit välittää joukon komentorivin lisäargumentteja, jotka komennolle on annettava, kun sitä kutsutaan:

use App\Console\Commands\SendEmailsCommand;$schedule->command('emails:send Taylor --force')->daily();$schedule->command(SendEmailsCommand::class, )->daily();

Oriviin asetettujen työtehtävien ajoittaminen

Oriviin asetettujen työtehtävien ajoittaminen jobMenetelmää jobedellyttää jonossa olevan työn ajoittamista. Tämä metodi tarjoaa kätevän tavan aikatauluttaa jonossa olevia töitä käyttämättä call-metodia, jolla määritetään sulkemiset työn jonottamista varten:

use App\Jobs\Heartbeat;$schedule->job(new Heartbeat)->everyFiveMinutes();

Metodille job voidaan antaa valinnaisia toista ja kolmatta argumenttia, jotka määrittelevät jonon nimen ja jonoyhteyden, jota työn jonottamiseen tulisi käyttää:

use App\Jobs\Heartbeat;// Dispatch the job to the "heartbeats" queue on the "sqs" connection...$schedule->job(new Heartbeat, 'heartbeats', 'sqs')->everyFiveMinutes();

Scheduling Shell Commands

Metodilla exec voidaan antaa komento käyttöjärjestelmälle:

$schedule->exec('node /home/forge/script.js')->daily();

Schedule Frequency Options

Olemme jo nähneet muutamia esimerkkejä siitä, miten voit määrittää tehtävän suoritettavaksi tietyin väliajoin. On kuitenkin paljon muitakin tehtävän aikataulutaajuuksia, joita voit määrittää tehtävälle:

.

.

Tapa Kuvaus
->cron('* * * * *'); Tehtävän suorittaminen mukautetulla cron-aikataululla
->everyMinute(); Suorita tehtävä minuutin välein
->everyTwoMinutes(); Suorita tehtävä kahden minuutin välein
->everyThreeMinutes(); Ajoita tehtävä kolmen minuutin välein
->everyFourMinutes(); Ajoita tehtävä neljän minuutin välein
->everyFiveMinutes(); Ajoita tehtävä neljän minuutin välein
->everyFiveMinutes(); Ajoita tehtävä viiden minuutin välein
->everyTenMinutes(); Suorita tehtävä kymmenen minuutin välein
->everyFifteenMinutes(); Suorita tehtävä vartin välein
->everyThirtyMinutes(); Suorita tehtävä kolmenkymmenen minuutin välein
->hourly(); Suorita tehtävä tunnin välein
->hourlyAt(17); Ajoita tehtävä joka tunti klo 17 minuutin kuluttua
->everyTwoHours(); Ajoita tehtävä joka toinen tunti
->everyThreeHours(); Ajoita tehtävä kolmen tunnin välein
->everyFourHours(); Ajoita tehtävä neljän tunnin välein
->everySixHours(); Ajoita tehtävä neljän tunnin välein
->everySixHours(); Ajoita tehtävä kuuden tunnin välein
->daily(); Toteuta tehtävä joka päivä keskiyöllä
->dailyAt('13:00'); Toteuta tehtävä joka päivä klo 13:00
->twiceDaily(1, 13); Toteuta tehtävä päivittäin klo 1:00 & 13:00
->weekly(); Toteuta tehtävä joka sunnuntai klo 00:00
->weeklyOn(1, '8:00'); Suorita tehtävä joka viikko maanantaina klo 8:00
->monthly(); Suorita tehtävä joka kuukauden ensimmäisenä päivänä klo 00:00
->monthlyOn(4, '15:00'); Ajoita tehtävä joka kuukauden 4. päivänä klo 15:00
->twiceMonthly(1, 16, '13:00'); Ajoita tehtävä kuukausittain 1. ja 16. päivänä klo 13:00
->lastDayOfMonth('15:00'); Ajoita tehtävä kuukauden viimeisenä päivänä klo 15:00
->quarterly(); Ajoita tehtävä jokaisen vuosineljänneksen ensimmäisenä päivänä klo 00:00
->yearly(); Suorita tehtävä joka vuoden ensimmäisenä päivänä klo 00:00
->yearlyOn(6, 1, '17:00'); Suorita tehtävä joka vuosi kesäkuun 1. päivänä klo 17:00
->timezone('America/New_York'); Aseta tehtävän aikavyöhyke

Nämä menetelmät voidaan yhdistää lisärajoituksiin, jotta voidaan luoda vieläkin hienosäätöisempiä aikatauluja, jotka suoritetaan vain tiettyinä viikonpäivinä. Voit esimerkiksi ajoittaa komennon ajettavaksi viikoittain maanantaina:

// Run once per week on Monday at 1 PM...$schedule->call(function () { //})->weekly()->mondays()->at('13:00');// Run hourly from 8 AM to 5 PM on weekdays...$schedule->command('foo') ->weekdays() ->hourly() ->timezone('America/Chicago') ->between('8:00', '17:00');

Luettelo aikataulujen lisärajoituksista on alla:

.

.

Menetelmä Kuvaus
->weekdays(); Tehtävän rajoittaminen arkipäiviin
->weekends(); Rajoita tehtävä viikonloppuihin
->sundays(); Rajoita tehtävä sunnuntaihin
->mondays(); Rajoita tehtävä maanantaille
->tuesdays(); Rajoita tehtävä tiistaille
->wednesdays(); Rajoita tehtävä tiistaille
->wednesdays(); Rajaa tehtävä keskiviikkoon
->thursdays(); Rajoita tehtävä torstaihin
->fridays(); Rajoita tehtävä perjantaihin
->saturdays(); Rajoita tehtävä lauantaille
->days(array|mixed); Rajoita tehtävä tietyille päiville
->between($startTime, $endTime); Rajoita tehtävä suorittamaan aloitus- ja lopetusajankohtien välillä
->unlessBetween($startTime, $endTime); Rajoita tehtävä olemaan suorittamatta aloitus- ja lopetusajankohtien välillä. lopetusajankohtien välillä
->when(Closure); Tehtävän rajoittaminen totuustestin perusteella
->environments($env); Tehtävän rajoittaminen tiettyihin ympäristöt

Päivärajoitukset

Menetelmällä days voidaan rajoittaa tehtävän suorittaminen tiettyihin viikonpäiviin. Voit esimerkiksi ajoittaa komennon suoritettavaksi tunneittain sunnuntaisin ja keskiviikkoisin:

$schedule->command('emails:send') ->hourly() ->days();

Vaihtoehtoisesti voit käyttää Illuminate\Console\Scheduling\Schedule-luokassa käytettävissä olevia vakioita määrittäessäsi päiviä, jolloin tehtävän tulee suorittaa:

use Illuminate\Console\Scheduling\Schedule;$schedule->command('emails:send') ->hourly() ->days();

Väliajan rajoitukset

Metodia between voidaan käyttää tehtävän suorituksen rajoittamiseen vuorokaudenajan perusteella:

Vastaavasti unlessBetween-menetelmää voidaan käyttää tehtävän suorittamisen poissulkemiseen tietyn ajanjakson ajaksi:

$schedule->command('emails:send') ->hourly() ->unlessBetween('23:00', '4:00');

Totuustestin rajoitukset

Menetelmää when voidaan käyttää tehtävän suorittamisen rajoittamiseen tietyn totuustestin tuloksen perusteella. Toisin sanoen, jos annettu sulku antaa tulokseksi true, tehtävä suoritetaan niin kauan kuin mikään muu rajoittava ehto ei estä tehtävän suorittamista:

$schedule->command('emails:send')->daily()->when(function () { return true;});

Metodia skip voidaan pitää when:n käänteisarvona. Jos skip-metodi palauttaa true, ajastettua tehtävää ei suoriteta:

$schedule->command('emails:send')->daily()->skip(function () { return true;});

Käytettäessä ketjutettuja when-metodeja ajastettu komento suoritetaan vain, jos kaikki when-ehdot palauttavat true.

Ympäristörajoitukset

Metodia environments voidaan käyttää tehtävien suorittamiseen vain annetuissa ympäristöissä (jotka on määritelty ympäristömuuttujalla APP_ENV):

$schedule->command('emails:send') ->daily() ->environments();

Aikavyöhykkeet

Metodin timezone avulla voit määrittää, että ajoitetun tehtävän aika tulkitaan tietyssä aikavyöhykkeessä:

$schedule->command('report:generate') ->timezone('America/New_York') ->at('2:00')

Jos määrität toistuvasti saman aikavyöhykkeen kaikille ajoitetuille tehtävillesi, voit halutessasi määritellä scheduleTimezone-metodin App\Console\Kernel-luokassa. Tämän metodin tulisi palauttaa oletusaikavyöhyke, joka tulisi määrittää kaikille ajastetuille tehtäville:

/** * Get the timezone that should be used by default for scheduled events. * * @return \DateTimeZone|string|null */protected function scheduleTimezone(){ return 'America/Chicago';}

{note} Muista, että jotkut aikavyöhykkeet käyttävät kesäaikaa. Kun kesäaikaa muutetaan, ajastettu tehtäväsi saatetaan suorittaa kahdesti tai jättää kokonaan suorittamatta. Tästä syystä suosittelemme mahdollisuuksien mukaan välttämään aikavyöhykeaikataulutusta.

Tehtävien päällekkäisyyksien estäminen

Ohjearvojen mukaan ajoitetut tehtävät ajetaan, vaikka tehtävän edellinen instanssi olisi vielä käynnissä. Voit estää tämän käyttämällä withoutOverlapping-menetelmää:

$schedule->command('emails:send')->withoutOverlapping();

Tässä esimerkissä emails:send Artisan-komento suoritetaan minuutin välein, jos se ei ole jo käynnissä. withoutOverlapping-menetelmä on erityisen hyödyllinen, jos sinulla on tehtäviä, joiden suoritusaika vaihtelee rajusti, jolloin et voi ennustaa tarkalleen, kuinka kauan tietty tehtävä kestää.

Tarpeen vaatiessa voit määrittää, kuinka monen minuutin on kuluttava, ennen kuin lukitus ”ilman päällekkäisyyttä” päättyy. Oletusarvoisesti lukitus päättyy 24 tunnin kuluttua:

$schedule->command('emails:send')->withoutOverlapping(10);

Tehtävien suorittaminen yhdellä palvelimella

{note} Tämän ominaisuuden hyödyntäminen edellyttää, että sovelluksesi käyttää database-, memcached-, dynamodb– tai redis-välimuistiohjainta sovelluksesi oletusvälimuistiohjaimena. Lisäksi kaikkien palvelimien on kommunikoitava saman keskitetyn välimuistipalvelimen kanssa.

Jos sovelluksesi ajastin on käynnissä useilla palvelimilla, voit rajoittaa ajastetun työn suorittamisen vain yhdellä palvelimella. Oletetaan esimerkiksi, että sinulla on ajastettu tehtävä, joka luo uuden raportin joka perjantai-ilta. Jos tehtävän ajoitusohjelma on käynnissä kolmella työpalvelimella, ajoitettu tehtävä suoritetaan kaikilla kolmella palvelimella ja raportti luodaan kolme kertaa. Ei hyvä!

Voidaksesi ilmoittaa, että tehtävä on suoritettava vain yhdellä palvelimella, käytä onOneServer-menetelmää, kun määrittelet ajoitettua tehtävää. Palvelin, joka ensimmäisenä saa tehtävän, varmistaa tehtävään atomilukon, joka estää muita palvelimia suorittamasta samaa tehtävää samaan aikaan:

$schedule->command('report:generate') ->fridays() ->at('17:00') ->onOneServer();

Taustatehtävät

Esimerkiksi useat samaan aikaan ajoitetut tehtävät suoritetaan peräkkäin siinä järjestyksessä, jossa ne on määritelty schedule-metodissa. Jos sinulla on pitkäkestoisia tehtäviä, tämä voi aiheuttaa sen, että seuraavat tehtävät alkavat paljon odotettua myöhemmin. Jos haluat suorittaa tehtäviä taustalla niin, että ne kaikki suoritetaan samanaikaisesti, voit käyttää runInBackground-menetelmää:

$schedule->command('analytics:report') ->daily() ->runInBackground();

{note} runInBackground-menetelmää saa käyttää vain silloin, kun tehtäviä ajoitetaan command– ja exec-menetelmien avulla.

Kunnossapitotila

Sovelluksen ajoitetut tehtävät eivät suorita, kun sovellus on kunnossapitotilassa, sillä emme halua, että tehtävät häiritsevät palvelimellasi mahdollisesti tehtävää keskeneräistä huoltoa. Jos kuitenkin haluat pakottaa tehtävän suoritettavaksi myös ylläpitotilassa, voit kutsua evenInMaintenanceMode-metodia tehtävää määritellessäsi:

$schedule->command('emails:send')->evenInMaintenanceMode();

Ajoitusohjelman suorittaminen

Nyt kun olemme oppineet määrittelemään ajoitettuja tehtäviä, puhutaanpa siitä, miten ne todella suoritetaan palvelimellamme. Artisan-komento schedule:run arvioi kaikki ajastetut tehtävät ja määrittää, onko ne suoritettava palvelimen senhetkisen kellonajan perusteella.

Käyttäessämme siis Laravelin ajastinta meidän tarvitsee lisätä palvelimellemme vain yksi cron-konfiguraatiomerkintä, joka suorittaa komennon schedule:run minuutin välein. Jos et osaa lisätä cron-merkintöjä palvelimellesi, harkitse Laravel Forgen kaltaisen palvelun käyttämistä, joka voi hallita cron-merkintöjä puolestasi:

* * * * * cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1

Ajoitusohjelman ajaminen paikallisesti

Tyypillisesti et lisäisi ajoitusohjelman cron-merkintää paikalliseen kehityskoneeseesi. Sen sijaan voit käyttää schedule:work Artisan-komentoa. Tämä komento toimii etualalla ja kutsuu ajastinta minuutin välein, kunnes lopetat komennon:

php artisan schedule:work

Tehtävien tulosteet

Laravel-ajastin tarjoaa useita käteviä menetelmiä ajastettujen tehtävien tuottamien tulosteiden käsittelyyn. Ensinnäkin, käyttämällä sendOutputTo-metodia, voit lähettää tulosteen tiedostoon myöhempää tarkastelua varten:

$schedule->command('emails:send') ->daily() ->sendOutputTo($filePath);

Jos haluat liittää tulosteen tiettyyn tiedostoon, voit käyttää appendOutputTo-metodia:

$schedule->command('emails:send') ->daily() ->appendOutputTo($filePath);

Menetelmällä emailOutputTo voit lähettää tulosteen sähköpostitse haluamaasi sähköpostiosoitteeseen. Ennen tehtävän tulosteen lähettämistä sähköpostitse sinun tulee määrittää Laravelin sähköpostipalvelut:

$schedule->command('report:generate') ->daily() ->sendOutputTo($filePath) ->emailOutputTo('');

Jos haluat lähettää tulosteen sähköpostitse vain, jos ajastettu Artisan- tai järjestelmäkomento päättyy nollasta poikkeavaan poistumiskoodiin, käytä emailOutputOnFailure-metodia:

$schedule->command('report:generate') ->daily() ->emailOutputOnFailure('');

{note} emailOutputTo-, emailOutputOnFailure-, sendOutputTo– ja appendOutputTo-menetelmät ovat yksinoikeus menetelmiin command ja exec.

Task Hooks

Metodien before ja after avulla voit määrittää koodin, joka suoritetaan ennen ajastetun tehtävän suorittamista ja sen jälkeen:

$schedule->command('emails:send') ->daily() ->before(function () { // The task is about to execute... }) ->after(function () { // The task has executed... });

Metodien onSuccess ja onFailure avulla voit määrittää koodin, joka suoritetaan, jos ajastettu tehtävä onnistuu tai epäonnistuu. Epäonnistuminen tarkoittaa, että ajastettu Artisan- tai järjestelmäkomento päättyi nollasta poikkeavaan poistumiskoodiin:

$schedule->command('emails:send') ->daily() ->onSuccess(function () { // The task succeeded... }) ->onFailure(function () { // The task failed... });

Jos komennosta on saatavissa ulostulo, voit käyttää sitä after-, onSuccess– tai onFailure-koukuissasi antamalla koukkusi sulkemismäärittelyn $output-argumenttina tyyppihuomautuksen Illuminate\Support\Stringable-instanssille:

use Illuminate\Support\Stringable;$schedule->command('emails:send') ->daily() ->onSuccess(function (Stringable $output) { // The task succeeded... }) ->onFailure(function (Stringable $output) { // The task failed... });

URL-osoitteiden pingaaminen

Metodien pingBefore ja thenPing avulla aikatauluttaja voi automaattisesti pingata tietyn URL-osoitteen ennen tai jälkeen tehtävän suorittamisen. Tämä menetelmä on hyödyllinen, kun halutaan ilmoittaa ulkoiselle palvelulle, kuten Envoyerille, että ajastettu tehtävä on alkamassa tai sen suoritus on päättynyt:

$schedule->command('emails:send') ->daily() ->pingBefore($url) ->thenPing($url);

Metodeilla pingBeforeIf ja thenPingIf voidaan pingata tiettyä URL-osoitetta vain, jos tietty ehto on true:

$schedule->command('emails:send') ->daily() ->pingBeforeIf($condition, $url) ->thenPingIf($condition, $url);

Metodeilla pingOnSuccess ja pingOnFailure voidaan pingata tiettyä URL-osoitetta vain, jos tehtävä onnistuu tai epäonnistuu. Epäonnistuminen tarkoittaa, että ajastettu Artisan- tai järjestelmäkomento päättyi nollasta poikkeavaan poistumiskoodiin:

$schedule->command('emails:send') ->daily() ->pingOnSuccess($successUrl) ->pingOnFailure($failureUrl);

Kaikki ping-metodit edellyttävät Guzzle HTTP -kirjastoa. Guzzle asennetaan yleensä oletusarvoisesti kaikkiin uusiin Laravel-projekteihin, mutta voit asentaa Guzzlen manuaalisesti projektiisi Composer-paketinhallinnan avulla, jos se on vahingossa poistettu:

composer require guzzlehttp/guzzle