服務(wù) ―― 任務(wù)調(diào)度

2018-02-24 15:38 更新

服務(wù) —— 任務(wù)調(diào)度

1、簡介

在以前,開發(fā)者需要為每一個需要調(diào)度然后添加這些Cron條目。Laravel命令調(diào)度器允許你平滑而又富有表現(xiàn)力地在Laravel中定義命令調(diào)度,并且服務(wù)器上只需要一個Cron條目即可。

任務(wù)調(diào)度定義在app/Console/Kernel.php文件的schedule方法中,該方法中已經(jīng)包含了一個示例。你可以自由地添加你需要的調(diào)度任務(wù)到Schedule對象。

1.1 開啟調(diào)度

下面是你唯一需要添加到服務(wù)器的Cron條目:

* * * * * php /path/to/artisan schedule:run 1>> /dev/null 2>&1

該Cron將會每分鐘調(diào)用Laravel命令調(diào)度,然后,Laravel評估你的調(diào)度任務(wù)并運行到期的任務(wù)。

2、定義調(diào)度

你可以在App\Console\Kernel類的schedule方法中定義所有調(diào)度任務(wù)。開始之前,讓我們看一個調(diào)度任務(wù)的例子,在這個例子中,我們將會在每天午夜調(diào)度一個被調(diào)用的閉包。在這個閉包中我們將會執(zhí)行一個數(shù)據(jù)庫查詢來清空表:

<?php

namespace App\Console;

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

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

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

除了調(diào)度閉包調(diào)用外,還可以調(diào)度Artisan命令和操作系統(tǒng)命令。例如,可以使用command方法來調(diào)度一個Artisan命令:

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

exec命令可用于發(fā)送命令到操作系統(tǒng):

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

2.1 調(diào)度常用選項

當(dāng)然,你可以分配多種調(diào)度到任務(wù):

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

這些方法可以和額外的約束一起聯(lián)合起來創(chuàng)建一周特定時間運行的更加細(xì)粒度的調(diào)度,例如,要每周一調(diào)度一個命令:

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

下面是額外的調(diào)度約束列表:

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

2.1.1 基于測試的約束條件

when方法用于限制任務(wù)在通過給定測試之后運行。換句話說,如果給定閉包返回true,只要沒有其它約束條件阻止任務(wù)運行,該任務(wù)就會執(zhí)行:

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

2.2 避免任務(wù)重疊

默認(rèn)情況下,即使前一個任務(wù)仍然在運行調(diào)度任務(wù)也會運行,要避免這樣的情況,可使用withoutOverlapping方法:

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

在本例中,Artisan命令emails:send每分鐘都會運行,如果該命令沒有在運行的話。如果你的任務(wù)在執(zhí)行時經(jīng)常大幅度的變化,那么withoutOverlapping方法就非常有用,你不必再去預(yù)測給定任務(wù)到底要消耗多長時間。

3、任務(wù)輸出

Laravel調(diào)度器為處理調(diào)度任務(wù)輸出提供了多個方便的方法。首先,使用sendOutputTo方法,你可以發(fā)送輸出到文件以便稍后檢查:

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

使用emailOutputTo方法,你可以將輸出發(fā)送到電子郵件,注意輸出必須首先通過sendOutputTo方法發(fā)送到文件。還有,使用電子郵件發(fā)送任務(wù)輸出之前,應(yīng)該配置Laravel的電子郵件服務(wù)

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

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

4、任務(wù)鉤子

使用beforeafter方法,你可以指定在調(diào)度任務(wù)完成之前和之后要執(zhí)行的代碼:

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

4.1 ping URL

使用pingBeforethenPing方法,調(diào)度器可以在任務(wù)完成之前和之后自動ping給定的URL。該方法在通知外部服務(wù)時很有用,例如Laravel Envoyer,在調(diào)度任務(wù)開始或完成的時候:

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

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

"guzzlehttp/guzzle": "~5.3|~6.0"
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號