首先我的層級目錄是這樣的
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