laravel —— 任務調度

一、簡介

任務調度定義在app/Console/Kernel.php文件的schedule方法中,該方法中已經包含了一個示例。你能夠自由地添加你須要的調度任務到Schedule對象。php

1.1 開啓調度

下面是你惟一須要添加到服務器的Cron條目:html

* * * * * php /項目目錄所在/artisan schedule:run 1>> /dev/null 2>&1

該Cron將會每分鐘調用Laravel命令調度,而後,Laravel評估你的調度任務並運行到期的任務。node

二、定義調度

你能夠在App\Console\Kernel類的schedule方法中定義全部調度任務。開始以前,讓咱們看一個調度任務的例子,在這個例子中,咱們將會在天天午夜調度一個被調用的閉包。在這個閉包中咱們將會執行一個數據庫查詢來清空表:laravel

<?php

namespace App\Console;

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

class Kernel extends ConsoleKernel{
    /**
     * 應用提供的Artisan命令
     *
     * @var array
     */
    protected $commands = [
        'App\Console\Commands\Inspire',
    ];

    /**
     * 定義應用的命令調度
     *
     * @param  \Illuminate\Console\Scheduling\Schedule  $schedule
     * @return void
     */
    protected function schedule(Schedule $schedule)
    {
        $schedule->call(function () {
            DB::table('recent_users')->delete();
        })->daily();
    }
}

除了調度閉包調用外,還能夠調度Artisan命令和操做系統命令。例如,能夠使用command方法來調度一個Artisan命令:數據庫

$schedule->command('emails:send --force')->daily();

exec命令可用於發送命令到操做系統:json

$schedule->exec('node /home/forge/script.js')->daily();

2.1 調度經常使用選項

固然,你能夠分配多種調度到任務:服務器

方法 描述
->cron('* * * * *'); 在自定義Cron調度上運行任務
->everyMinute(); 每分鐘運行一次任務
->everyFiveMinutes(); 每五分鐘運行一次任務
->everyTenMinutes(); 每十分鐘運行一次任務
->everyThirtyMinutes(); 每三十分鐘運行一次任務
->hourly(); 每小時運行一次任務
->daily(); 天天凌晨零點運行任務
->dailyAt('13:00'); 天天13:00運行任務
->twiceDaily(1, 13); 天天1:00 & 13:00運行任務
->weekly(); 每週運行一次任務
->monthly(); 每個月運行一次任務

這些方法能夠和額外的約束一塊兒聯合起來建立一週特定時間運行的更加細粒度的調度,例如,要每週一調度一個命令:閉包

$schedule->call(function () {
    // 每週星期一13:00運行一次...
})->weekly()->mondays()->at('13:00')

下面是額外的調度約束列表:app

方法 描述
->weekdays(); 只在工做日運行任務
->sundays(); 每一個星期天運行任務
->mondays(); 每一個星期一運行任務
->tuesdays(); 每一個星期二運行任務
->wednesdays(); 每一個星期三運行任務
->thursdays(); 每一個星期四運行任務
->fridays(); 每一個星期五運行任務
->saturdays(); 每一個星期六運行任務
->when(Closure); 基於特定測試運行任務

2.1.1 基於測試的約束條件

when方法用於限制任務在經過給定測試以後運行。換句話說,若是給定閉包返回true,只要沒有其它約束條件阻止任務運行,該任務就會執行:composer

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

2.2 避免任務重疊

默認狀況下,即便前一個任務仍然在運行調度任務也會運行,要避免這樣的狀況,可以使用withoutOverlapping方法:

$schedule->command('emails:send')->withoutOverlapping();

在本例中,Artisan命令emails:send每分鐘都會運行,若是該命令沒有在運行的話。若是你的任務在執行時常常大幅度的變化,那麼withoutOverlapping方法就很是有用,你沒必要再去預測給定任務到底要消耗多長時間。

三、任務輸出

Laravel調度器爲處理調度任務輸出提供了多個方便的方法。首先,使用sendOutputTo方法,你能夠發送輸出到文件以便稍後檢查:

$schedule->command('emails:send')
         ->daily()
         ->sendOutputTo($filePath);

使用emailOutputTo方法,你能夠將輸出發送到電子郵件,注意輸出必須首先經過sendOutputTo方法發送到文件。還有,使用電子郵件發送任務輸出以前,應該配置Laravel的電子郵件服務

$schedule->command('foo')
         ->daily()
         ->sendOutputTo($filePath)
         ->emailOutputTo('foo@example.com');

注意:emailOutputTosendOutputTo方法只對command方法有效,不支持call方法。

四、任務鉤子

使用beforeafter方法,你能夠指定在調度任務完成以前和以後要執行的代碼:

$schedule->command('emails:send')
         ->daily()
         ->before(function () {
             // Task is about to start...
         })
         ->after(function () {
             // Task is complete...
         });

4.1 ping URL

使用pingBeforethenPing方法,調度器能夠在任務完成以前和以後自動ping給定的URL。該方法在通知外部服務時頗有用,例如Laravel Envoyer,在調度任務開始或完成的時候:

$schedule->command('emails:send')
         ->daily()
         ->pingBefore($url)
         ->thenPing($url);

使用pingBefore($url)thenPing($url)特性須要安裝HTTP庫Guzzle,能夠在composer.json 文件中添加以下行來安裝Guzzle到項目:

"guzzlehttp/guzzle": "~5.3|~6.0"
相關文章
相關標籤/搜索