Laravel’de Görev Zamanlama

Bu makalede, Laravel web çerçevesinin heyecan verici özelliklerinden biri olan görev zamanlaması üzerinden geçeceğiz. Bu makale boyunca, Laravel’in uygulamanızda zamanlanmış görevleri yönetmenize nasıl izin verdiğine bakacağız. Ayrıca, gösteri amacıyla kendi özel zamanlanmış görevlerimizi de oluşturacağız.
Laravel çerçevesi, zamanlanmış görevleri ayarlamanıza olanak tanır, böylece bunları sistem düzeyinde ayarlama konusunda endişelenmenize gerek kalmaz. Laravel, bunları kullanıcı dostu bir şekilde tanımlamanıza izin verdiğinden, zamanlanmış görevleri ayarlarken bu karmaşık cron sözdiziminden kurtulabilirsiniz.
Makaleye geleneksel cron işlerini kurmaya nasıl alıştığınızla başlayacağız ve ardından bunu başarmanın Laravel yolunu keşfedeceğiz. Makalenin ikinci yarısında, konuyla ilgili uygulamalı bilgi sağlaması gereken birkaç özel zamanlanmış görev oluşturarak bunu deneyeceğiz.
Geleneksel Zamanlanmış Görev Kurulumu
Günlük uygulama geliştirmenizde, belirli komut dosyalarını veya komutları düzenli aralıklarla yürütmenizi gerektiren bir durumla sık sık karşılaşırsınız. *nix sistemiyle çalışıyorsanız, muhtemelen cron işlerinin bu komutları işlediğinin farkındasınızdır. Öte yandan, Windows tabanlı sistemlerde zamanlanmış görevler olarak bilinirler.
*nix tabanlı cron işinin basit bir örneğine hızlıca göz atalım.
*/5 * * * * /web/statistics.sh
Oldukça basit— statistics.sh
her beş dakikada bir dosyalayın!
Bu oldukça basit bir kullanım örneği olsa da, kendinizi genellikle daha karmaşık kullanım örneklerini uygulamanızı gerektiren bir durumda bulursunuz. Öte yandan, karmaşık bir sistem, farklı zaman aralıklarında çalışan birden çok cron işi tanımlamanızı gerektirir.
Karmaşık bir web uygulamasının arka uçta periyodik olarak gerçekleştirmesi gereken bazı görevleri görelim.
- Veritabanı arka ucundaki gereksiz verileri temizleyin.
- Güncel tutmak için ön uç önbelleğe alma dizinlerini güncelleyin.
- Site istatistiklerini hesaplayın.
- Mailleri gönder.
- Farklı site öğelerini yedekleyin.
- Raporlar oluşturun.
- Ve dahası.
Gördüğünüz gibi, periyodik olarak ve ayrıca farklı zaman aralıklarında çalıştırılmayı bekleyen birçok şey var. Deneyimli bir sistem yöneticisiyseniz, tüm bu görevler için cron işlerini tanımlamanız çok kolay, ancak bazen geliştiriciler olarak daha kolay bir yol olmasını diliyoruz.
Neyse ki, Laravel yerleşik bir Görev Zamanlama Daha önce hiç olmadığı gibi zamanlanmış görevleri tanımlamanıza izin veren API. Ve evet, bir sonraki bölüm tamamen bununla ilgili – Laravel görev planlamasının temelleri.
Laravel Yolu
Önceki bölümde, cron işlerini kurmanın geleneksel yolundan geçtik. Bu bölümde, Task Scheduling API bağlamında Laravel’in özelliklerini inceleyeceğiz.
Devam etmeden önce, anlamamız gereken en önemli şey, Laravel tarafından sağlanan zamanlama özelliğinin tıpkı diğer özellikler gibi olduğu ve otomatik olarak çağrılmayacağıdır. Yani sistem düzeyinde herhangi bir şey yapmanız gerekmediğini düşünüyorsanız, şansınızın tükendiğini söyleyebilirim.
Aslında, Laravel zamanlama sistemini kullanmak istemeniz durumunda yapmanız gereken ilk şey, her dakika çalışan ve aşağıdaki snippet’te gösterilen artisan komutunu çağıran cron işini kurmaktır.
* * * * * php /path-to-your-project/artisan schedule:run >> /dev/null 2>&1
Yukarıdaki artisan komutu, Laravel zamanlayıcısını çağırır ve bu da uygulamanızda tanımlanan bekleyen tüm cron işlerini yürütür.
Tabii ki, Laravel uygulamanızda zamanlanmış görevleri nasıl tanımlayacağımızı henüz görmedik ve bundan sonra dalacağımız şey bu.
Bu schedule
yöntemi AppConsoleKernel
Uygulamaya özel zamanlanmış görevler tanımlamak isterseniz kullanmanız gereken sınıf.
Devam edin ve içeriği alın app/Console/Kernel.php
dosya.
<?php namespace AppConsole; use IlluminateConsoleSchedulingSchedule; use IlluminateFoundationConsoleKernel as ConsoleKernel; class Kernel extends ConsoleKernel { /** * The Artisan commands provided by your application. * * @var array */ protected $commands = [ 'AppConsoleCommandsInspire', ]; /** * Define the application's command schedule. * * @param IlluminateConsoleSchedulingSchedule $schedule * @return void */ protected function schedule(Schedule $schedule) { $schedule->command('inspire')->hourly(); } }
Gördüğünüz gibi, çekirdek kodun kendisi faydalı bir örnek sunuyor. Yukarıdaki örnekte, Laravel aşağıdakileri çalıştırır: inspire
zanaatkar komutu saatlik. Sözdiziminin ilk etapta çok sezgisel olduğunu düşünmüyor musunuz?
Aslında, Laravel’in zamanlama görevlerini tanımlamanıza izin verdiği birkaç farklı yol vardır:
- Kapatma/çağrılabilirliği kullanın.
- Zanaatkar komutunu çağırın.
- Kabuk komutunu yürütün.
Ayrıca, aralarından seçim yapabileceğiniz çok sayıda yerleşik zamanlama frekansı vardır:
- her dakika/beş dakikada bir
- saatlik/günlük/haftalık/üç aylık/yıllık
- günün belirli bir saatinde
- ve daha fazlası
Aslında, özel cron işlerinizi oluşturmak için kabuğa dokunmanıza gerek kalmaması için eksiksiz bir rutin seti sağladığını söyleyebilirim!
Evet, özel zamanlanmış görevlerinizi nasıl uygulayacağınızı öğrenmek için istekli olduğunuzu söyleyebilirim ve makalenin başında da söz verdiğim şey bu.
Laravel’de İlk Zamanlanmış Görevinizi Oluşturun
Tartıştığımız gibi, Laravel’in zamanlanmış görevleri tanımlamanıza izin verdiği farklı yollar vardır. Nasıl çalıştığını anlamak için her birinin üzerinden geçelim.
Kapatma/Çağrılama Yöntemi
Zamanlama API’si şunları sağlar: call
çağrılabilir veya kapatma işlevi yürütmenize izin veren yöntem. revize edelim app/Console/Kernel.php
Aşağıdaki kod ile dosya.
<?php namespace AppConsole; use IlluminateSupportFacadesDB; use IlluminateConsoleSchedulingSchedule; use IlluminateFoundationConsoleKernel as ConsoleKernel; class Kernel extends ConsoleKernel { /** * Define the application's command schedule. * * @param IlluminateConsoleSchedulingSchedule $schedule * @return void */ protected function schedule(Schedule $schedule) { // the call method $schedule->call(function () { $posts = DB::table('posts') ->select('user_id', DB::raw('count(*) as total_posts')) ->groupBy('user_id') ->get(); foreach($posts as $post) { DB::table('users_statistics') ->where('user_id', $post->user_id) ->update(['total_posts' => $post->total_posts]); } })->everyThirtyMinutes(); } }
Gördüğünüz gibi, kapatma fonksiyonunu ilk argüman olarak geçtik. call
yöntem. Ayrıca, frekansı her 30 dakikada bir olarak ayarladık, böylece kapatma işlevini her 30 dakikada bir gerçekleştirecek!
Örneğimizde, kullanıcı başına toplam gönderileri sayıyoruz ve istatistik tablosunu buna göre güncelliyoruz.
Esnaf Komutanlığı
Kapanışlar veya çağrılar dışında, belirli aralıklarla yürütülecek bir artisan komutu da planlayabilirsiniz. Aslında, aynı zamanda daha iyi kod organizasyonu ve yeniden kullanılabilirlik sağladığından, kapatmalara göre tercih edilen yaklaşım bu olmalıdır.
Devam edin ve içeriği gözden geçirin. app/Console/Kernel.php
aşağıdaki dosya ile.
<?php namespace AppConsole; use IlluminateSupportFacadesConfig; use IlluminateConsoleSchedulingSchedule; use IlluminateFoundationConsoleKernel as ConsoleKernel; class Kernel extends ConsoleKernel { /** * The Artisan commands provided by your application. * * @var array */ protected $commands = [ 'AppConsoleCommandsUserStatistics' ]; /** * Define the application's command schedule. * * @param IlluminateConsoleSchedulingSchedule $schedule * @return void */ protected function schedule(Schedule $schedule) { // artisan command method $schedule->command('statistics:user')->everyThirtyMinutes(); } /** * Register the Closure based commands for the application. * * @return void */ protected function commands() { require base_path('routes/console.php'); } }
Bu command
Yukarıdaki kod parçacığında gösterildiği gibi bir artisan komutu planlamak isterseniz kullanmak istediğiniz yöntem. Artisan komut imzasını, ilk argüman olarak iletmeniz gerekir. command
yöntem.
Tabii ki, ilgili artisan komutunu da tanımlamanız gerekir. app/Console/Commands/UserStatistics.php
.
<?php namespace AppConsoleCommands; use IlluminateConsoleCommand; use IlluminateSupportFacadesDB; class UserStatistics extends Command { /** * The name and signature of the console command. * * @var string */ protected $signature="statistics:user"; /** * The console command description. * * @var string */ protected $description = 'Update user statistics'; /** * Create a new command instance. * * @return void */ public function __construct() { parent::__construct(); } /** * Execute the console command. * * @return mixed */ public function handle() { // calculate new statistics $posts = DB::table('posts') ->select('user_id', DB::raw('count(*) as total_posts')) ->groupBy('user_id') ->get(); // update statistics table foreach($posts as $post) { DB::table('users_statistics') ->where('user_id', $post->user_id) ->update(['total_posts' => $post->total_posts]); } } }
Yürütme Komutu
Buraya kadar tartıştığımız yöntemlerin Laravel uygulamasının kendisine özgü olduğunu söyleyebiliriz. Ayrıca Laravel, dış uygulamaları da çalıştırabilmeniz için kabuk komutlarını zamanlamanıza izin verir.
Veritabanınızın yedeğini her gün nasıl alacağınızı gösteren hızlı bir örnek üzerinden gidelim.
<?php namespace AppConsole; use IlluminateConsoleSchedulingSchedule; use IlluminateFoundationConsoleKernel as ConsoleKernel; class Kernel extends ConsoleKernel { /** * Define the application's command schedule. * * @param IlluminateConsoleSchedulingSchedule $schedule * @return void */ protected function schedule(Schedule $schedule) { // exec method $host = config('database.connections.mysql.host'); $username = config('database.connections.mysql.username'); $password = config('database.connections.mysql.password'); $database = config('database.connections.mysql.database'); $schedule->exec("mysqldump -h {$host} -u {$username} -p{$password} {$database}") ->daily() ->sendOutputTo('/backups/daily_backup.sql'); } }
Kullanmanız gereken koddan anlaşılıyor exec
zamanlayıcının yöntemini seçin ve çalıştırmak istediğiniz komutu ilk argümanı olarak iletmeniz gerekir.
Bunun dışında, biz de kullandık sendOutputTo
komutun çıktısını toplamanızı sağlayan yöntem. Öte yandan, bir yöntem var, emailOutputTo
çıktı içeriğini e-posta ile göndermenizi sağlar!
Ve bu bizi makalenin sonuna getiriyor. Aslında, Laravel Scheduling API’nin yüzeyini henüz çizdik ve onun kedicik içinde sunacağı çok şey var.
Çözüm
Bugün, Laravel web çerçevesindeki görev zamanlama API’sini inceledik. Periyodik olarak çalıştırılması gereken görevleri yönetmenize ne kadar kolay izin verdiğini görmek büyüleyiciydi.
Makalenin başında, zamanlanmış görevleri ayarlamanın geleneksel yolunu tartıştık ve ardından bunu yapmanın Laravel yolunu tanıttık. Makalenin ikinci yarısında, görev zamanlama kavramlarını göstermek için birkaç pratik örnekten geçtik.
Umarım makaleyi beğenmişsinizdir ve Laravel’de zamanlanmış görevler ayarlama konusunda kendinize daha fazla güvenmelisiniz. Laravel’e yeni başlayanlar veya bilginizi, sitenizi veya uygulamanızı uzantılarla genişletmek isteyenler için, çalışabileceğiniz çeşitli konularımız var. Envato Pazarı.
Aklınıza bir şey gelirse, aşağıdaki beslemeyi kullanarak bir sohbet başlatalım!