Laravel Cron
Bu yazıda Laravel’le yaptığınız bir uygulama da zamanlanmış görevlere ihtiyacınız olduğunda kullanılan bir teknikten bahsedeceğim. Diyelim ki saatte bir çalıştırmanız gereken bir kod blogunuz var. Linux sistemlerde Shell Script yazıp crontab’a ekleye bileceğiniz gibi bu işlemi Laravel’le de yapabilirsiniz. Lafı fazla uzatmadan başlayalım. İlk olarak işi yapacak command‘i oluşturalım. bunun için terminale aşağıdaki artisan komutunu yazın.
php artisan make:command TestCron
yukarıdaki komut app/Console/Commands/
klasörü içerisinde TestCron.php
adında bir dosya oluşturacak.
namespace App\Console\Commands;
use Illuminate\Console\Command;
class TestCron extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'command:name';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Command description';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
//
}
}
$signature
değişkeni command adını taşınır.
protected $signature = 'yazici';
Şeklinde değiştirin. handle()
fonksiyonu ise asıl işi yapan kodun olduğu alandır.
public function handle()
{
Storage::put('deneme.txt', 'command test');
}
Şuana kadar çalıştırıldığında storage/app/deneme.txt
dosyasını oluşturup içerisine command test
yazan command classını oluşturduk. Test etmek için terminale aşağıdaki artisan komutu yazabilirsiniz.
php artisan yazici
Her şey yolunda ise ikinci adıma yani, command’i ConsoleKernel tanıtmaya geçelim. Bu işlemi app/Console/Kernel.php
dosyasını aşağıdaki gibi düzenleyerek yapabilirsiniz.
protected $commands = [
TestCron::class
];
protected function schedule(Schedule $schedule)
{
$schedule->command('yazici')->everyMinute();
}
Bura da everyMinute()
fonksiyonu önemli. Görevin ne sıklıkla çalışacağını bu fonksiyonla belirtebiliyorsunuz. Yazını sonunda kullanabileceğiniz tüm fonksiyonların tablosu olacak. Şimdi yazdığımız programı test edelim.
php artisan schedule:run
Sıra geldi yazdığımız programı crontab’a eklemeye. İlk olarak sunucunuzda php’nin nerede kuru olduğunu bilmeniz gerekiyor. Terminale which php
yazarak php komutunun path’ini öğrenebilirsiniz. Kuvvetle muhtemel /usr/bin/php
sonucunu alacaksınız. İkinci adım sa artisan dosyasının path’ini almak olacak. artisan dosyası laravel projenizin ana dizinindedir. artisan komutlarınızı çalıştırdığınız dizinde pwd
komutunu yazarsanız size /var/www/html
gibi tam path’i verecektir. Crontab’a ekleyeceğiniz komut aşağıdaki gibi olacak.
* * * * * /usr/bin/php /var/www/html/artisan schedule:run >> /dev/null 2>&1
Yukarıdaki komutu crontab’a eklemek için terminalde crontab -e
komutunu çalıştırın. Bu komut crond dosyasını nano ile açacaktır. Eğer açılmazsa sunucunuza apt install nano
komutu ile nano‘yu kurun. crond dosyasının en altına yukarıda hazırladığınız komut satırını ekleyerek kaydedin. Artık dakikada bir programınız çalışacaktır. Eğer işlem başarılı olmazsa sunucunuzda cron’un kurulu ve çalış durumda olduğundan emin olun.
Cron’u kurmak için
apt install crond
Cron’u çalıştırmak için
/etc/init.d/cron start
Cron’u yeniden başlatmak için
/etc/init.d/cron restart
Crontab da yaptığınız değişikliklerin algılanması içinse
/etc/init.d/cron reload
Komutlarını kullana bilirsiniz.
ConsoleKernel içinde kullanabileceğiniz tüm zamanlayıcı fonksiyolar.
Yöntem | Açıklama |
---|---|
->weekdays(); |
Görevi hafta içi günlerle sınırlayın |
->weekends(); |
Görevi hafta sonlarıyla sınırlayın |
->sundays(); |
Görevi Pazar ile sınırlayın |
->mondays(); |
Görevi Pazartesi ile sınırla |
->tuesdays(); |
Görevi Salı ile sınırla |
->wednesdays(); |
Görevi Çarşamba ile sınırlayın |
->thursdays(); |
Görevi Perşembe ile sınırla |
->fridays(); |
Görevi Cuma ile sınırlayın |
->saturdays(); |
Görevi Cumartesi ile sınırla |
->between($start, $end); |
Görevi başlangıç ve bitiş saatleri arasında çalışacak şekilde sınırlayın |
->when(Closure); |
Bir doğruluk testine göre görevi sınırlayın |
->environments($env); |
Görevi belirli ortamlarla sınırlayın |
Bu bilgilendirici yazı için teşekkür ederim