Taakplanning in Laravel

In dit artikel zullen we een van de spannende functies van de Laravel web framework-task scheduling doornemen. In de loop van dit artikel zullen we bekijken hoe u met Laravel geplande taken in uw toepassing kunt beheren. Bovendien zullen we uiteindelijk ook onze eigen aangepaste geplande taken maken voor demonstratiedoeleinden.

Met het Laravel-framework kunt u geplande taken instellen, zodat u zich geen zorgen hoeft te maken over het instellen ervan op systeemniveau. U kunt die complexe cron-syntaxis verwijderen tijdens het instellen van geplande taken, aangezien u met Laravel deze op een gebruiksvriendelijke manier kunt definiëren.

We beginnen het artikel met hoe u gewend bent om traditionele cron-taken op te zetten, en hierna zullen we de Laravel-manier onderzoeken om dit te bereiken. In de tweede helft van het artikel zullen we het proberen door enkele aangepaste geplande taken te maken die praktisch inzicht moeten geven in het onderwerp.

Traditionele geplande taakinstellingen

In uw dagelijkse applicatie-ontwikkeling, staat u vaak voor een situatie waarbij u periodiek bepaalde scripts of opdrachten moet uitvoeren. Als u met het * nix-systeem werkt, weet u waarschijnlijk dat cron-taken met deze opdrachten omgaan. Aan de andere kant staan ​​ze bekend als geplande taken op Windows-systemen.

Laten we even kijken naar een eenvoudig voorbeeld van de * nix-gebaseerde cron-job.

* / 5 * * * * /web/statistics.sh

Vrij eenvoudig - het draait het statistics.sh bestand om de vijf minuten!

Hoewel dat een vrij eenvoudige use-case was, bevindt u zich vaak in een situatie waarin u meer complexe use-cases moet implementeren. Aan de andere kant vereist een complex systeem dat u meerdere cron-taken definieert die op verschillende tijdsintervallen worden uitgevoerd.

Laten we een aantal taken bekijken die een complexe webtoepassing periodiek moet uitvoeren in de back-end.

  • Ruim de onnodige gegevens op uit de back-end van de database.
  • Werk de front-end caching-indexen bij zodat deze up-to-date blijven.
  • Bereken de sitestatistieken.
  • Stuur emails.
  • Maak een back-up van verschillende elementen van de site.
  • Genereer rapporten.
  • En meer.

Dus, zoals u kunt zien, er zijn genoeg dingen die wachten om periodiek te worden uitgevoerd en ook op verschillende tijdsintervallen. Als je een ervaren systeembeheerder bent, is het een taartwandeling om de cron-taken voor al deze taken te definiëren, maar soms willen we als ontwikkelaars dat er een gemakkelijkere manier is om.

Gelukkig komt Laravel met een ingebouwde Taakplanning API waarmee u geplande taken als nooit tevoren kunt definiëren. En ja, het volgende gedeelte gaat daarover - de basis van Laravel-taakplanning.

De Laravel Way

In het vorige gedeelte hebben we de traditionele manier besproken om cron-taken in te stellen. In dit gedeelte zullen we de details van Laravel doornemen in de context van de Task Scheduling API.

Voordat we verder gaan, is het belangrijk om te begrijpen dat de planningsfunctie van Laravel net als elke andere functie is en niet automatisch wordt opgeroepen. Dus als je denkt dat je niets hoeft te doen op systeemniveau, dan heb je pech, zou ik zeggen.

Het eerste wat u moet doen als u het planningsysteem van Laravel wilt gebruiken, is om de cron-taak in te stellen die elke minuut wordt uitgevoerd en de artisan-opdracht in het volgende fragment wordt weergegeven..

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

Het bovenstaande artisan-commando roept de Laravel-scheduler aan en die voert op zijn beurt alle cron-taken in afwachting uit die zijn gedefinieerd in uw toepassing.

Natuurlijk moeten we nog zien hoe we de geplande taken in uw Laravel-toepassing kunnen definiëren, en dat is het volgende waar we in duiken.

Het is de planning methode van de App \ Console \ Kernel klasse die u moet gebruiken als u toepassingsspecifieke geplande taken wilt definiëren.

Ga je gang en pak de inhoud van de app / Console / Kernel.php het dossier.

commando ( 'inspireren') -> per uur (); 

Zoals u kunt zien, biedt de kerncode zelf een handig voorbeeld. In het bovenstaande voorbeeld wordt Laravel uitgevoerd door inspireren ambachtelijk commando per uur. Denk je niet dat de syntaxis in de eerste plaats zo intuïtief is??

In feite zijn er een aantal verschillende manieren waarop Laravel u toestaat om planningstaken te definiëren:

  • Gebruik de sluiting / opvraagbaar.
  • Roep het ambachtelijke commando.
  • Voer de shell-opdracht uit.

Bovendien zijn er tal van ingebouwde planningsfrequenties waaruit u kunt kiezen:

  • elke minuut / elke vijf minuten
  • per uur / dag / week / kwartaal / jaar
  • op een specifiek tijdstip van de dag
  • en nog veel meer

Sterker nog, ik zou zeggen dat het een complete set routines biedt, zodat je de shell nooit hoeft aan te raken om je eigen cron-taken te maken!

Ja, ik kan u vertellen dat u graag wilt weten hoe u uw aangepaste geplande taken kunt uitvoeren, en dat heb ik ook aan het begin van het artikel beloofd.

Maak je eerste geplande taak in Laravel

Zoals we hebben besproken, zijn er verschillende manieren waarop u met Laravel geplande taken kunt definiëren. Laten we ze allemaal doornemen om te begrijpen hoe het werkt.

De sluitings- / opvraagmethode

De plannings-API biedt de telefoontje methode waarmee u een opvraagbare of afsluitende functie kunt uitvoeren. Laten we het herzien app / Console / Kernel.php bestand met de volgende code.

call (function () $ posts = DB :: table ('posts') -> select ('user_id', DB :: raw ('count (*) als total_posts')) -> groupBy ('user_id') - > get (); foreach ($ posts als $ post) DB :: table ('users_statistics') -> where ('user_id', $ post-> user_id) -> update (['total_posts' => $ post- > total_posts]);) -> everyThirtyMinutes (); 

Zoals u kunt zien, hebben we de sluitingsfunctie als het eerste argument van de telefoontje methode. We hebben ook de frequentie ingesteld op elke 30 minuten, zodat de sluitingsfunctie om de 30 minuten wordt uitgevoerd!

In ons voorbeeld tellen we de totale berichten per gebruiker en werken de statistiekentabel dienovereenkomstig bij.

Het ambachtelijke commando

Afgezien van de sluitingen of callables, kunt u ook een ambachtelijk commando plannen dat met bepaalde tussenpozen wordt uitgevoerd. In feite zou dat de voorkeur moeten hebben boven sluitingen, omdat het tegelijkertijd zorgt voor een betere code-indeling en herbruikbaarheid.

Ga je gang en herzie de inhoud van de app / Console / Kernel.php bestand met het volgende.

commando ( 'statistieken: user') -> everyThirtyMinutes ();  / ** * Registreer de op afsluiting gebaseerde opdrachten voor de toepassing. * * @return void * / protected function commands () require base_path ('routes / console.php'); 

Het is de commando methode die u wilt gebruiken als u een artisan-opdracht wilt plannen zoals in het bovenstaande codefragment. U moet de artisanale opdrachthandtekening doorgeven als het eerste argument van de commando methode.

Natuurlijk moet je ook de bijbehorende artisan-opdracht definiëren app / Console / Commands / UserStatistics.php.

select ('user_id', DB :: raw ('count (*) als total_posts')) -> groupBy ('user_id') -> get (); // update statistiekentabel foreach ($ posts als $ post) DB :: table ('users_statistics') -> where ('user_id', $ post-> user_id) -> update (['total_posts' => $ post- > total_posts]); 

Het Exec-commando

We zouden kunnen zeggen dat de methoden die we tot nu toe besproken hebben specifiek zijn voor de Laravel-applicatie zelf. Bovendien kunt u met Laravel ook de shell-opdrachten plannen, zodat u ook externe toepassingen kunt uitvoeren.

Laten we een kort voorbeeld bekijken dat aantoont hoe u elke dag een back-up van uw database maakt.

exec ("mysqldump -h $ host -u $ gebruikersnaam -p $ password $ database") -> daily () -> sendOutputTo ('/ backups / daily_backup.sql'); 

Het is duidelijk uit de code dat je de exec methode van de planner en u moet de opdracht die u als eerste argument wilt uitvoeren, doorgeven.

Afgezien daarvan hebben we ook de sendOutputTo methode waarmee u de uitvoer van de opdracht kunt verzamelen. Aan de andere kant is er een methode, emailOutputTo, waarmee u de uitvoerinhoud per e-mail kunt verzenden!

En dat brengt ons tot het einde van het artikel. We hebben zelfs net het oppervlak van de Laravel Scheduling API gekrast en het heeft veel te bieden in zijn kitty.

Conclusie

Vandaag hebben we de API voor taakplanning doorgenomen in het Laravel-webraamwerk. Het was fascinerend om te zien hoe gemakkelijk het u toestaat om taken te beheren die periodiek moeten worden uitgevoerd.

Aan het begin van het artikel bespraken we de traditionele manier om geplande taken in te stellen, en daarna hebben we de Laravel-manier geïntroduceerd om het te doen. In de tweede helft van het artikel hebben we een aantal praktische voorbeelden doorgenomen om concepten voor taakplanning aan te tonen.

Ik hoop dat je het artikel leuk vond en dat je meer vertrouwen moet hebben in het instellen van geplande taken in Laravel. Voor degenen onder u die net zijn begonnen met Laravel of die op zoek zijn om uw kennis, site of applicatie uit te breiden met uitbreidingen, hebben we een aantal dingen die u kunt bestuderen in Envato Market.

Als er iets in je opkomt, gaan we een gesprek beginnen met de onderstaande feed!