Laravel 設定排程,自動執行指令

Laravel 設定排程,自動執行指令

Laravel 自帶類似crontab的功能,設定起來非常方便。
好處就是可以隨著專案一起上git;壞處就是會隨著專一起上git哈哈哈~

我用自己是有設定排程固定時間進行更新,並且在執行維護的時候寄Email通知我,下面就是設定的內容啦~


首先我的層級目錄是這樣的app
 -Console
   -Commands
     -Update1.php
     -Update2.php
 -Kernel.php

然後在 Kernel.php 中寫 - 要執行的指令 && 排程<?phpnamespace App\Console;use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
use Config;
use Mail;
use Log;class Kernel extends ConsoleKernel
{
   // 如果有自定義的Command,這要在這先註冊 class name
   protected $commands = [
       Commands\Update1::class,
       Commands\Update2::class,
   ];protected function schedule(Schedule $schedule)
   {// 任務1
       $schedule
           ->command('update:num1')
           ->weekly() // 每週執行
           ->mondays() // 每個星期一執行
           ->at(Config::get('update.time')) // 維護的時間在config中
           ->after(function () {
               Log::info('維護開始');
               Mail::raw('維護開始', function($message) {
                   $message->to('my-email@mail.com');
                   $message->subject('維護開始');
               });
       });// 任務2
       $schedule
           ->command...
           ->...
   }
}?>

然後要注意的是,在維護的時候一般是任務是不會生效的,
所以要用 evenInMaintenanceMode()$schedule->command('down');
$schedule->command('update:num1')->evenInMaintenanceMode(); //這樣才會執行
$schedule->command('up')->evenInMaintenanceMode();


承上:要如何自訂 Command 呢?

首先,透過artisan建立命令php artisan make:command Update1

然後在 app/Console/Commands/ 下會生成 Update1.php ,內容為<?phpnamespace App\Console\Commands;use Illuminate\Console\Command;class Update1 extends Command
{
   // 取名你要下的指令名稱,可以和 class name 不同
   protected $signature = 'update:num1';// 簡單的功能描述
   protected $description = 'Update num1 Sum';public function __construct()
   {
       parent::__construct();
   }// 這個命要要執行的內容
   public function handle()
   {
       $this->mySum();
   }// 這句可以讓執行完後,在畫面上顯示一些提示
   $this->info('Update num1 finished');// handle() 裡面可以用外面的function才不會一大包    
   protected function mySum($x, $y)
   {
       ...
   }
}?>

更詳細的排程設定可以參考
https://laravel-china.org/docs/laravel/5.5/scheduling/1325#maintenance-mode