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

平民百姓
4 min readJan 7, 2019

--

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

--

--

平民百姓
平民百姓

Written by 平民百姓

由後端轉全端的弱弱工程師 - 生活筆記

No responses yet