۱-مدیریت زمان بندی کارها در لاراول با cron

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 فایل بالا اجرا می گردد و شما نیاز به کد نویسی اولیه فایل بالا ندارید .

پیشنهاد پیرو برای شما :   آموزش design pattern

کد زیر به معنی نام دستور می باشد:

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  اضافه می گردد .

پیشنهاد پیرو برای شما :   psr2

لاراول با cron

و با اجرای دستور زیر اجرا می گردد :

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

توجه نمایید در صورتی که گام آخر را به درستی اجرا نمایید کل سیستم مدیریت زمان کار نمی کند جهت تست دستور می توانید قسمت کامند را جدا اجرا نمایید و در صورت اجرای صحیح دستور بالا را جرا نمایید .

لطفا جهت مشاهده مقالات بیشتر صفحه آموزش افزودن حمعهی – حرفه ای لاراول ما را دنبال نمایید

پیشنهاد پیرو برای شما :   بارگزاری فایل (File Uploading) در کد ایگنایتر