Laravel-任務調度

Laravel 命令調度器允許你在 Laravel 中對命令調度進行清晰流暢的定義,並且僅需要在服務器上增加一條 Cron 項目即可。

你的調度已經定義在 app/Console/Kernel.php 文件的 schedule 方法中。爲了方便你開始,在該方法內包含了一個簡單的例子。你可以隨意增加調度到 Schedule 對象中。

1、唯一一個需要加入到服務器的 Cron 項目(注意這裏path爲項目絕對路徑):

* * * * * php /path/to/artisan schedule:run >> /dev/null 2>&1
e.g. * * * * * php /home/vagrant/Code/test/artisan schedule:run >> /dev/null 2>&1

2、你可以將所有的計劃任務定義在 App\Console\Kernel 類的 schedule 方法中。在開始之前,先讓我們來看看一個任務的調度示例。在該例子中,我們計劃了一個會在每分鐘被調用的閉包。該閉包將插入一條數據:

<?php

namespace App\Console;

use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
use Illuminate\Support\Facades\DB;

class Kernel extends ConsoleKernel
{
    protected $commands = [
        Commands\Inspire::class,
    ];

    /**
     * 在這裏定義你的計劃任務
     */
    protected function schedule(Schedule $schedule)
    {
        //每分鐘添加一條數據
        $schedule->call(function () {
            $data = [
                'name'=>'myname'.rand(2,100),
                'email'=>'myname'.rand(2,100).'@126.com',
                'password'=>bcrypt('123456'),
            ];
            DB::table('users')->insert($data); 
        })->everyMinute();
        
        
    }
}

調度頻率設置#

當然,你可以針對你的任務來分配多種調度計劃:

方法 描述
->cron('* * * * * *'); 在自定義的 Cron 調度運行該任務
->everyMinute(); 每分鐘運行該任務
->everyFiveMinutes(); 每五分鐘運行該任務
->everyTenMinutes(); 每十分鐘運行該任務
->everyThirtyMinutes(); 每三十分鐘運行該任務
->hourly(); 每小時運行該任務
->daily(); 每天午夜運行該任務
->dailyAt('13:00'); 每天的 13:00 運行該任務
->twiceDaily(1, 13); 每天的 1:00 及 13:00 運行該任務
->weekly(); 每週運行該任務
->monthly(); 每月運行該任務
->yearly(); 每年運行該任務

這些方法可以合併其它限制條件以生成更精確的調度。例如在某周的某幾天運行調度。舉個例子,計劃一個每週週一的調度:

$schedule->call(function () {
    // 在每個禮拜一的 13:00 運行一次...
})->weekly()->mondays()->at('13:00');

下方列出其它額外限制條件:

方法 描述
->weekdays(); 限制任務在工作日
->sundays(); 限制任務在星期日
->mondays(); 限制任務在星期一
->tuesdays(); 限制任務在星期二
->wednesdays(); 限制任務在星期三
->thursdays(); 限制任務在星期四
->fridays(); 限制任務在星期五
->saturdays(); 限制任務在星期六
->when(Closure); 限制任務基於一個爲真的驗證;

爲真驗證限制條件#

when 方法可以用來判斷是否要運行任務,主要基於一個指定的爲真驗證的運行結果。換句話說,如果指定的 閉包返回 true,且沒有其它限制條件存在,那麼這個任務將會被繼續運行。

$schedule->command('emails:send')->daily()->when(function () {
    return true;
});

當鏈式調用了 when 方法時,計劃命令只有在所有的 when 條件返回 true 時才運行。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章