cron job in laravel
لاراول با cron چیست ؟ cron یک سیستم مدیریت زمان بندی کارهای ار اساس سیستم یونیکس می باشد در واقع با استفاده از این قابلیت می توانیم مشخص نماییم یک یری کارهای به صورت اتوماتیک در زمانهای مشخص انجام شود .
کرون ها دارای دو قسمت می باشد قسمتی جهت مشخص نمودن زمان اجرا و قسمتی جهت کد اجرایی
* * * * * command/to/run
در واقع ما در کرونها می گوییم هر چه قدر زمان این دستور را اجرا نما .
در قسمت اول که متشکل از ***** می باشد مشخص کننده زمان اجرا می باشد که در صورتی که ***** وارد شود به معنی اجرای هر دقیقه می باشد .
۲۰ ۶ ۱۰ * * command/to/run
به طور مثال در کرون بالا می گوییم ساعت ۶:۲۰ در ۱۰ هر ماه اجرا شود جهت تنظیم زمانی می توانید از سایت زیر استفاده نمایید :
https://crontab.guru/#1_*_*_*_*
لاراول با cron
برای کار با کرون ها در لاراول نیاز است یک command بسازیم و هر بار که نیاز به آن داشتیم با ارتیسان آن را صدا می زنیم :
php artisan make:command WordOfTheDay
با اجرای دستور بالا فایلی در آدرس app/Console/Commands قرار می گیرد که شامل محتوای زیر است .
<?php namespace App\Console\Commands; use Illuminate\Console\Command; class WordOfTheDay 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() { // } }
توجه داشته باشید با اجرای دستور ساخت command فایل بالا اجرا می گردد و شما نیاز به کد نویسی اولیه فایل بالا ندارید .
کد زیر به معنی نام دستور می باشد:
protected $signature = 'command:name';
که به طور مثال باید به کد زیر تغییر کند
protected $signature = 'word:day';
هر دستور دارای یک توضیحی می باشد که به صورت زیر تعریف می گردد :
protected $description = 'Send a Daily email to all users with a word and its meaning';
در متد handle اصل اجرا نوشته میشود به مثال زیر توجه نمایید :
<?php namespace App\Console\Commands; use App\User; use Illuminate\Console\Command; use Illuminate\Support\Facades\Mail; class WordOfTheDay extends Command { /** * The name and signature of the console command. * * @var string */ protected $signature = 'word:day'; /** * The console command description. * * @var string */ protected $description = 'Send a Daily email to all users with a word and its meaning'; /** * Create a new command instance. * * @return void */ public function __construct() { parent::__construct(); } /** * Execute the console command. * * @return mixed */ public function handle() { $words = [ 'aberration' => 'a state or condition markedly different from the norm', 'convivial' => 'occupied with or fond of the pleasures of good company', 'diaphanous' => 'so thin as to transmit light', 'elegy' => 'a mournful poem; a lament for the dead', 'ostensible' => 'appearing as such but not necessarily so' ]; // Finding a random word $key = array_rand($words); $value = $words[$key]; $users = User::all(); foreach ($users as $user) { Mail::raw("{$key} -> {$value}", function ($mail) use ($user) { $mail->from('info@tutsforweb.com'); $mail->to($user->email) ->subject('Word of the Day'); }); } $this->info('Word of the Day sent to All Users'); } }
این مثال برای تمامی کاربران ایمیل ارسال می کند.
رجیستر نمودن کامند و دستور
جهت اضافه نمودن کامند ویا دستور به برنامه در فایل app/Console/Kernel.php دستور مورد نظر را اضفه می نماییم.
<?php namespace App\Console; use Illuminate\Console\Scheduling\Schedule; use Illuminate\Foundation\Console\Kernel as ConsoleKernel; class Kernel extends ConsoleKernel { /** * The Artisan commands provided by your application. * * @var array */ protected $commands = [ Commands\WordOfTheDay::class, ]; /** * Define the application's command schedule. * * @param \Illuminate\Console\Scheduling\Schedule $schedule * @return void */ protected function schedule(Schedule $schedule) { $schedule->command('word:day') ->daily(); } /** * Register the commands for the application. * * @return void */ protected function commands() { $this->load(__DIR__.'/Commands'); require base_path('routes/console.php'); } }
همانگونه که مشاهده می فرمایید دستور به صور روزانه اضافه گردید همچنین دستور در کامند php artisan list اضافه می گردد .
و با اجرای دستور زیر اجرا می گردد :
php artisan word:day
زمان های اجرا : می توانید با استفاده مقادیر زیرا زمان اجرای دستور را مشخص نمایید :
Method | Description |
---|---|
->cron(‘* * * * * *’); | Run the task on a custom Cron schedule |
->everyMinute(); | Run the task every minute |
->everyFiveMinutes(); | Run the task every five minutes |
->everyTenMinutes(); | Run the task every ten minutes |
->everyFifteenMinutes(); | Run the task every fifteen minutes |
->everyThirtyMinutes(); | Run the task every thirty minutes |
->hourly(); | Run the task every hour |
->hourlyAt(17); | Run the task every hour at 17 mins past the hour |
->daily(); | Run the task every day at midnight |
->dailyAt(’۱۳:۰۰′); | Run the task every day at 13:00 |
->twiceDaily(1, 13); | Run the task daily at 1:00 & 13:00 |
->weekly(); | Run the task every week |
->weeklyOn(1, ‘۸:۰۰’); | Run the task every week on Tuesday at 8:00 |
->monthly(); | Run the task every month |
->monthlyOn(4, ’۱۵:۰۰′); | Run the task every month on the 4th at 15:00 |
->quarterly(); | Run the task every quarter |
->yearly(); | Run the task every year |
->timezone(‘America/New_York’); | Set the timezone |
اضافه نمودن لاراول به سیستم کرون لینوکس
جهت اضافه نمودن سیستم مدیریت کار و اجرای کدهای بالا در زمان مقرر کد زیر را در دستور crontab -e قرار می دهیم .
* * * * * cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1
توجه نمایید در صورتی که گام آخر را به درستی اجرا نمایید کل سیستم مدیریت زمان کار نمی کند جهت تست دستور می توانید قسمت کامند را جدا اجرا نمایید و در صورت اجرای صحیح دستور بالا را جرا نمایید .
لطفا جهت مشاهده مقالات بیشتر صفحه آموزش افزودن حمعهی – حرفه ای لاراول ما را دنبال نمایید