Programarea sarcinilor în Laravel

În acest articol, vom trece printr-una dintre trăsăturile interesante ale planificării sarcinilor web-cadru Laravel. Pe tot parcursul acestui articol, vom analiza modul în care Laravel vă permite să gestionați sarcinile programate în aplicația dvs. Mai mult, vom ajunge, de asemenea, să creăm sarcini programate personalizate pentru demonstrații.

Cadrul Laravel vă permite să configurați sarcini programate astfel încât să nu vă faceți griji cu privire la configurarea lor la nivel de sistem. Puteți să scăpați de sintaxa complexă cron în timp ce stabiliți sarcini programate, deoarece Laravel vă permite să le definiți într-un mod ușor de utilizat.

Vom începe articolul cu modul în care vă obișnuiți să configurați lucrările tradiționale cron, urmând că vom explora modul Laravel de realizare a acestuia. În a doua jumătate a articolului, vom încerca să creăm câteva sarcini programate personalizate, care ar trebui să ofere o perspectivă detaliată asupra subiectului.

Setarea tradițională de activități programate

În dezvoltarea de aplicații de zi cu zi, vă confruntați adesea cu o situație care vă cere să executați periodic anumite scripturi sau comenzi. Dacă lucrați cu sistemul * nix, probabil că sunteți conștient de faptul că lucrările cron se ocupă de aceste comenzi. Pe de altă parte, sunt cunoscute ca sarcini programate pe sisteme bazate pe Windows.

Să aruncăm o privire rapidă la un exemplu simplu al jobului cron bazat pe * nix.

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

Destul de simplu - rulează statistics.sh dosar la fiecare cinci minute!

Deși a fost un caz de utilizare destul de simplu, vă aflați adesea într-o situație care vă cere să implementați cazuri de utilizare mai complexe. Pe de altă parte, un sistem complex necesită definirea mai multor sarcini cron care rulează la intervale de timp diferite.

Să vedem câteva sarcini pe care o aplicație web complexă trebuie să le efectueze periodic în back-end.

  • Curățați datele inutile din back-end-ul bazei de date.
  • Actualizați indexurile de caching din front-end pentru a le menține la zi.
  • Calculați statisticile site-ului.
  • Trimite emailuri.
  • Creați copii de rezervă pentru diferite elemente ale site-ului.
  • Generați rapoarte.
  • Și altele.

Deci, după cum puteți vedea, există o mulțime de lucruri care așteaptă să fie executate periodic și, de asemenea, la intervale de timp diferite. Dacă sunteți un administrator de sistem condimentat, este un tort plimbare pentru ca dvs. să definiți cron de locuri de muncă pentru toate aceste sarcini, dar uneori noi ca dezvoltatori doresc ca a existat o cale mai ușoară în jurul.

Din fericire, Laravel vine cu un built-in Programarea sarcinilor API care vă permite să definiți sarcini programate ca niciodată înainte. Și da, următoarea secțiune este totul despre asta - elementele de bază ale planificării sarcinilor Laravel.

Calea Laravel

În secțiunea anterioară, am trecut prin modul tradițional de creare a cron de locuri de muncă. În această secțiune, vom trece prin specificul lui Laravel în contextul API-ului Scheduling de sarcini.

Înainte de a continua, este important să înțelegeți faptul că funcția de programare oferită de Laravel este la fel ca orice altă caracteristică și nu va fi invocată automat. Deci, dacă te gândești că nu trebuie să faci nimic la nivel de sistem, atunci nu ai noroc, aș spune.

De fapt, primul lucru pe care ar trebui să-l faceți dacă doriți să utilizați sistemul de programare Laravel este să setați sarcina cron care rulează la fiecare minut și să apeleze comanda artizanală afișată în fragmentul următor.

* * * * * programul php / path-to-your-project / artizan: rulați >> / dev / null 2> & 1

Comanda artizanală de mai sus cheamă programatorul Laravel și, la rândul său, execută toate lucrările cron în așteptare definite în aplicația dvs..

Desigur, nu avem încă de văzut cum să definim sarcinile planificate în aplicația dvs. Laravel, și acesta este următorul lucru pe care îl vom scufunda în.

Este vorba de programa metodă a App \ Console \ Kernel de clasă pe care trebuie să o utilizați, dacă doriți să definiți sarcini programate specifice aplicației.

Mergeți și luați conținutul app / Console / Kernel.php fişier.

comandă ( 'inspira') -> pe oră (); 

După cum puteți vedea, codul de bază în sine oferă un exemplu util. În exemplul de mai sus, Laravel rulează a inspira comanda artizanilor pe oră. Nu credeți că sintaxa este atât de intuitivă în primul rând?

De fapt, există câteva moduri diferite în care Laravel vă permite să definiți sarcinile programate:

  • Utilizați dispozitivul de închidere / declanșare.
  • Sunați comandantul artizanal.
  • Executați comanda shell.

Mai mult, există o mulțime de frecvențe de programare încorporate pe care le puteți alege:

  • fiecare minut / la fiecare cinci minute
  • pe oră / zi / săptămână / trimestrial / anual
  • la un anumit moment al zilei
  • si multe altele

De fapt, aș spune că oferă un set complet de rutine, astfel încât să nu aveți nevoie să atingeți coaja pentru a vă crea cron!

Da, pot să vă spun că sunteți dornici să știți cum să vă implementați sarcinile programate personalizate și asta am promis și la începutul articolului.

Creați prima sarcină programată în Laravel

După cum am discutat, există diferite modalități prin care Laravel vă permite să definiți sarcinile planificate. Să trecem prin fiecare pentru a înțelege cum funcționează.

Metoda de închidere / apelare

Programul API de programare oferă apel metodă care vă permite să executați o funcție apelată sau închisă. Să revizuim app / Console / Kernel.php fișier cu următorul cod.

apel (funcția () $ posts = DB :: tabel ('posts') -> select ('user_id', DB :: raw ('count (*) as total_posts')) > get (), foreach ($ posturi ca $ post) DB :: table ('users_statistics') -> unde ('user_id', $ post-> user_id) > total_posts]);) -> everyThirtyMinutes (); 

După cum puteți vedea, am trecut funcția de închidere ca fiind primul argument al lui apel metodă. De asemenea, am setat frecvența la fiecare 30 de minute, așa că va executa funcția de închidere la fiecare 30 de minute!

În exemplul nostru, numărăm postările totale per utilizator și actualizăm tabelul cu statistici în consecință.

Comandamentul artizanal

În afară de închideri sau de apeluri de învinuit, puteți programa și o comandă artizanală care va fi executată la anumite intervale. De fapt, aceasta ar trebui să fie abordarea preferată în ceea ce privește închiderile, deoarece oferă o mai bună organizare a codurilor și reutilizabilitate în același timp.

Continuați și revizuiți conținutul app / Console / Kernel.php fișier cu următoarele.

comandă ( 'statistici: utilizator') -> everyThirtyMinutes ();  / ** * Înregistrați comenzile bazate pe Closure pentru aplicație. * * @return void * / comenzi de funcții protejate () necesită base_path ('routes / console.php'); 

Este vorba de comanda pe care doriți să o utilizați, dacă doriți să programați o comandă artizanală așa cum se arată în fragmentul de cod de mai sus. Trebuie să transmiteți semnătura comandamentului artizanal ca fiind primul argument al lui comanda metodă.

Desigur, trebuie să definiți și comanda artizanală corespunzătoare app / Console / Comenzi / UserStatistics.php.

selectați ('user_id', DB :: raw ('count (*) ca total_posts')) -> groupBy ('user_id') -> get (); // actualizeaza statisticile tabelului foreach ($ posturi ca $ post) DB :: table ('users_statistics') -> unde ('user_id', $ post-> user_id) -> update (['total_posts' > TOTAL_POSTS]); 

Comanda Exec

Am putea spune că metodele pe care le-am discutat până acum erau specifice aplicației Laravel. În plus, Laravel vă permite de asemenea să programați comenzile shell, astfel încât să puteți rula și aplicații externe.

Să trecem printr-un exemplu rapid care demonstrează cum să faceți o copie de siguranță a bazei de date în fiecare zi.

exec ("mysqldump -h $ gazdă -u $ username -p $ parola $ database") -> zilnic () -> sendOutputTo ('/ backups / daily_backup.sql'); 

Din cod apare evident că trebuie să utilizați Exec metoda de planificator și trebuie să transmiteți comanda pe care doriți să o executați ca primul său argument.

În afară de asta, am folosit și sendOutputTo care vă permite să colectați ieșirea comenzii. Pe de altă parte, există o metodă, emailOutputTo, care vă permite să trimiteți prin e-mail conținutul de ieșire!

Și asta ne aduce la sfârșitul articolului. De fapt, tocmai am zgâriat suprafața API-ului Laravel Scheduling, și are multe de oferit în pisica sa.

Concluzie

Astăzi, am trecut prin programul API de programare a sarcinilor în cadrul web Laravel. A fost fascinant să vezi cât de ușor vă permite să gestionați sarcinile care trebuie să fie executate periodic.

La începutul articolului, am discutat modul tradițional de stabilire a sarcinilor programate, iar după aceea am introdus modul Laravel de a face acest lucru. În a doua jumătate a articolului, am trecut prin câteva exemple practice pentru a demonstra conceptele de programare a sarcinilor.

Sper că v-ați bucurat de acest articol și ar trebui să vă simțiți mai încrezători în stabilirea unor sarcini programate în Laravel. Pentru cei care sunteți fie doar începători cu Laravel, fie căutați să vă extindeți cunoștințele, site-ul sau aplicația cu extensii, avem o varietate de lucruri pe care le puteți studia în piața Envato.

În cazul în care vă apare ceva în minte, începeți o conversație utilizând feedul de mai jos!

Cod