فرض کنید در سیستم خود ، در ساعاتی از روز ، روزهایی از هفته و یا ماه و... ، عملیات خاصی را میخواهید انجام دهید ، مانند ارسال گزارش فروش روزانه در ساعت 12:00 هرشب به مدیر از طریق ایمیل در قالب یک فایل PDF، چک کردن تعداد کالاهای فروخته شده در هر 6 ساعت ، محاسبه قیمت کل کالاهای باقی مانده در فروشگاه در هر 40 دقیقه و... ، زمان بندی اجرای تمامی این تسک ها را میتوان از راه Task Scheduling در لاراول انجام داد .
در گذشته ، باید برای کارهای زمان بندی شده ، در سرور cron job تعریف میکردید و با افزایش وظایف زمان بندی شده ، این امر به یک کار حوصله سربر ، مبدل میشد .
Task Schedulingدر Laravel به شما امکان می دهد تا cron job ها و تسک های خود را به راحتی تعریف کرده و از طریق  فایل Console / Kernel.php ، آنها را مدیریت نمایید .

فرض کنید ، عملیاتی دارید که میخواهید روزانه ، فهرست اطلاعات تمامی کاربرانی را که حساب کاربری آنها ، غیرفعال میباشد را در یک فایل json ذخیره کنید . با استفاده از روش زیر ، میتوان به راحتی این کار را اتوماتیک و توسط cron job انجام در لاراول انجام داد .

    protected function schedule(Schedule $schedule)
    {
        $schedule->call(function () {
            file_put_contents("users.json", User::where("activated", false)->get());
        })->daily();
    }​

توجه داشته باشد که اگر بخواهید به جای استفاده از کلوژر ، یک کلاس را فراخوانی کنید ، آن کلاس حتما باید متد invoke را پیاده سازی کرده باشد ، به عنوان مثال ، میخواهیم یک کلاس که وظیفه ایجاد فایل json برای کاربران غیرفعال را بر عهده دارد را فراخوانی کنیم .

class CreateInactiveUsersJsonFile
{
    
    public function __invoke()
    {
        file_put_contents("users.json", User::where("activated", false)->get());
    }
    
}
class Kernel extends ConsoleKernel
{
    
    protected $commands = [
        //
    ];
    
    protected function schedule(Schedule $schedule)
    {
        $schedule->call(new CreateInactiveUsersJsonFile)->daily();
    }
}

حال برای اجرای scheduled task ها از دستور زیر استفاده میکنیم .

php artisan schedule:run

زمان بندی job ها :

$schedule->job(new SendSMSJob)->everyFiveMinutes();

زمان بندی اجرای دستورات شل سیستم عامل :

 $schedule->exec('echo ls-la > list.log')->daily();

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

ااجرای task طبق تنظیمات سفارشی در cron job ('* * * * *')cron
اجرای task به صورت سالانه yearly
اجرای task در هر ربع ساعت quarterly
اجرای task به صورت ماهانه در ساعت 15:00 monthlyOn(4, '15:00')
اجرای task  در هرماه monthly
اجرای task به صورت ماهانه weeklyOn(1, '8:00')
اجرای task به صورت هفتگی weekly
اجرای task روزانه در ساعت های 1:00 و 13:00 twiceDaily(1, 13)
اجرای task روازانه در ساعت 13:00 dailyAt('13:00')
اجرای task به صورت روزانه daily
اجرای task در هر ساعت (هفده دقیقه بعد از شروع ساعت است) hourlyAt(17)
اجرای task در هر ساعت hourly 
اجرای task در هر نیم ساعت everyThirtyMinutes
اجرای task در هر 50 دقیقه everyFifteenMinutes
اجرای task در هر ده دقیقه everyTenMinutes
اضافه کردن timezone timezone('America/New_York')
اجرای task در هر پنج دقیقه everyFiveMinutes
اجرای task در هر دقیقه everyMinute
شکل زیر شامل اطلاعاتی در باره set کردن ساعت و دقیقه و... به cron job است :
# ----------------------------------------------------------
# +---------------- minute (0 - 59)
# |  +------------- hour (0 - 23)
# |  |  +---------- day of month (1 - 31)
# |  |  |  +------- month (1 - 12)
# |  |  |  |  +---- day of week (0 - 7) (Sunday=0 or 7)
# |  |  |  |  |
# *  *  *  *  *  command to be executed
#-----------------------------------------------------------​

این توابع و روش ها ممکن است با توابع دیگری ترکیب شوند تا برنامه هایی با کیفیت دقیق تر که فقط در روزهای خاصی از هفته اجرا می شود ، ایجاد شود. به عنوان مثال ، برای تعیین دستور برای اجرای هفتگی در روز دوشنبه:

//از ساعت 8:00 تا 17:00
$schedule->command('foo')
          ->weekdays()
          ->hourly()
          ->timezone('America/NewYork')
          ->between('8:00', '17:00');

این جدول شامل انواع اعمال محدودیت در زمان بندی میباشد :

اجرای task بین ساعت های مشخص شده between($start, $end)
اجرای task در یک شنبه sundays
اجرای task در دو شنبه mondays
اجرای task در شه شنبه tuesdays
اجرای task در چهار شنبه wednesdays
اجرای task در پنج شنبه thursdays
اجرای task در جمعه fridays
اجرای task در شنبه saturdays
اجرای task در پایان هفته weekdays
اجرای task در صورت اعمال شدن یک اتفاق خاص when(Closure)

به طور پیش فرض ، دستورات زمان بندی شده در یک زمان به طور متوالی اجرا می شوند. اگر دستورات طولانی دارید ، این کار ممکن است باعث شود که دستورات بعدی خیلی دیرتر از وقت پیش بینی شده شروع شوند. اگر می خواهید دستوراتی را در پس زمینه اجرا کنید تا همه آنها به طور همزمان اجرا شوند ، می توانید از روش runInBackground استفاده کنید:

$schedule->command('analytics:report')
         ->daily()
         ->runInBackground();

اگر بخواهید خروجی بعضی از دستورات را در یک فایل ذخیره کنید ، میتوانید از راه زیر استفاده کنید :

$schedule->exec('ls -la')->everyFifteenMinutes()
         ->sendOutputTo("ls.txt");

برای ایمیل کردن خروجی ، از روش زیر میتوان استفاده کرد :

      $schedule->exec('ls -la')->everyFifteenMinutes()
            ->sendOutputTo("ls.txt")
            ->emailOutputTo("info@admin.com");

اگر اجرای یک task با خطا مواجه شد ، میتوان از روش زیر استفاده کرد :

$schedule->command('foo')
         ->daily()
         ->emailOutputOnFailure('support@admin.com');

Task Hookها در زمان بندی

با استفاده از روشهای before و after، می توانید كدی را تعیین كنید كه قبل و بعد از اتمام كار زمان بندی شده اجرا شود:
$schedule->command('emails:send')
         ->daily()
         ->before(function () {
             // Task is about to start...
         })
         ->after(function () {
             // Task is complete...
         });

توابع onSuccess و OnFailure به شما امکان می دهند کدهایی را تعیین کنید که در صورت موفقیت یا عدم موفقیت هنگام اجرای زمان بندی ها ، اجرا شوند :

$schedule->command('emails:send')
         ->daily()
         ->onSuccess(function () {
             // The task succeeded...
         })
         ->onFailure(function () {
             // The task failed...
         });