Laravel 任務調度(Console)

在之前,開發者須要爲每個須要調度的任務編寫一個Cron條目,這是很讓人頭疼的事。你的任務調度不在源碼控制中,你必須使用SSH登陸到服務器而後添加這些Cron條目。Laravel命令調度器容許你平滑而又富有表現力地在Laravel中定義命令調度,而且服務器上只須要一個Cron條目便可。php

任務調度又是咱們俗稱的「計劃任務」linux

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

1.開啓調度服務器

在linux環境中執行app

* * * * * root php /var/www/laravel/artisan schedule:run

/var/www/laravel爲你的項目目錄ide

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

2.定義調度ui

2.1 
在項目根目錄中 下建立定時任務所須要進行的操做this

建立命令:php artisan make:console Stat_Testurl

該操做會在app/Console/Commands下生成一個Stat_Test.php

下面打開該文件 給你們展現一個簡單而又完整的代碼例子

<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;  
class Stat_Test extends Command  
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'stat:test';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'stat:test';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
        $this->addData();
    }

    // 小例子
    public function addData(){
        $time = time();
        $rand = rand(1,1000);
        $id = \DB::table('data_test')->insertGetId(['uuid'=>$time,'uuid'=>$rand]);
    if($id){
       \Log::info('定時/數據插入成功.',$id);
    }else{
       \Log::error('定時/數據插入失敗.',$time);
    }
    }
}

值得注意的是 這個文件中的

$signature = 'stat:test'

這個簽名在Kernel.php中也要相應用到

下面也附上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 = [
        \App\Console\Commands\Inspire::class,
        '\App\Console\Commands\Stat_Test',
    ];

    /**
     * Define the application's command schedule.
     *
     * @param  \Illuminate\Console\Scheduling\Schedule  $schedule
     * @return void
     */
    protected function schedule(Schedule $schedule)
    {
       //  爲測試方便 每分鐘執行一次
        $schedule->command('stat:test')->everyMinute();
    }
}

再強調一次 $schedule->command('stat:test') 裏面的stat:test必須和上面的簽名 $signature = 'stat:test'對應上

protected $commands = [  
        \App\Console\Commands\Inspire::class,
        '\App\Console\Commands\Stat_Test',
    ];

也要把引入你的調度文件

// 每週星期六11:00運行一次...
$schedule->command('stat:test')->weekly()->saturdays()->at('11:00');

// 每週星期一:00運行一次...
$schedule->command('stat:test')->weekly()->->mondays()->at('01:00');

2.2 調度經常使用選項

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

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

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

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

原文地址

相關文章
相關標籤/搜索