# Laravel schedule 設定
Laravel タスクスケジュールは cron タスクの定期実行する作業を楽にしてくれる便利機能です。
app/Console/Kernel.php ファイルの schedule メソッド定義することでサーバ上でスケジュールするタスクを管理できるようになります。
スケジューラの実行
一行を cron に登録するだけで今までコマンドが増やす度に crontab を編集することなくります。
* * * * * cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1
# スケジュールオプション
| メソッド | 説明 |
|---|---|
| ->cron('* * * * *'); | カスタム cron スケジュールでタスクを実行 |
| ->everyMinute(); | 毎分タスク実行 |
| ->everyTwoMinutes(); | 2分毎にタスク実行 |
| ->everyThreeMinutes(); | 3分毎にタスク実行 |
| ->everyFourMinutes(); | 4分毎にタスク実行 |
| ->everyFiveMinutes(); | 5分毎にタスク実行 |
| ->everyTenMinutes(); | 10分毎にタスク実行 |
| ->everyFifteenMinutes(); | 15分毎にタスク実行 |
| ->everyThirtyMinutes(); | 30分毎にタスク実行 |
| ->hourly(); | 毎時タスク実行 |
| ->hourlyAt(17); | 1時間ごと、毎時17分にタスク実行 |
| ->everyTwoHours(); | 2時間毎にタスク実行 |
| ->everyThreeHours(); | 3時間毎にタスク実行 |
| ->everyFourHours(); | 4時間毎にタスク実行 |
| ->everySixHours(); | 6時間毎にタスク実行 |
| ->daily(); | 毎日深夜12時に実行 |
| ->dailyAt('13:00'); | 毎日 13:00 に実行 |
| ->twiceDaily(1, 13); | 毎日 1:00 と 13:00 時に実行 |
| ->weekly(); | 毎週日曜日の 00:00 にタスク実行 |
| ->weeklyOn(1, '8:00'); | 毎週月曜日の 8:00 時に実行 |
| ->monthly(); | 毎月1日の 00:00 にタスク実行 |
| ->monthlyOn(4, '15:00'); | 毎月 4 日の 15:00 に実行 |
| ->twiceMonthly(1, 16, '13:00'); | 毎月1日と16日の 13:00 にタスク実行 |
| ->lastDayOfMonth('15:00'); | 毎月最終日の 15:00 時に実行 |
| ->quarterly(); | 四半期の初日の 00:00 にタスク実行 |
| ->yearly(); | 毎年1月1日の 00:00 にタスク実行 |
| ->yearlyOn(6, 1, '17:00'); | 毎年6月1日の 17:00 にタスク実行 |
| ->timezone('Asia/Tokyo'); | タスクのタイムゾーンを設定 |
追加のスケジュール制約のリスト
| メソッド | 説明 |
|---|---|
| ->weekdays(); | ウィークデーのみに限定 |
| ->weekends(); | ウィークエンドのみに限定 |
| ->sundays(); | 日曜だけに限定 |
| ->mondays(); | 月曜だけに限定 |
| ->tuesdays(); | 火曜だけに限定 |
| ->wednesdays(); | 水曜だけに限定 |
| ->thursdays(); | 木曜だけに限定 |
| ->fridays(); | 金曜だけに限定 |
| ->saturdays(); | 土曜だけに限定 |
| ->days(array|mixed); | 特定の日にちだけに限定[0,1,2,3,4,5,6]日月火水木金土 |
| ->between($startTime, $endTime); | 開始と終了時間間にタスク実行を制限 |
| ->unlessBetween($startTime, $endTime); | 開始と終了時間間にタスクを実行しないよう制限 |
| ->when(Closure); | クロージャの戻り値が true の時のみに限定 |
| ->environments($env); | 指定の環境でのみタスク実行を限定 |
# when 論理テスト制約
特定の論理テストの結果に基づいてタスクの実行を制限するメソッドで
指定したクロージャが true を返す場合、他の制約が実行を停止しない限りタスクを実行されます
when() をいくつかチェーンした場合、全部の when 条件が true を返すときのみスケジュールされたコマンドが実行されます
$schedule->command('emails:send')->daily()->when(function () {
return true;
});
# 環境制約
environments メソッドは、指定する環境でのみタスクを実行
$schedule->command('emails:send')
->daily()
->environments(['staging', 'production']);
# タイムゾーン設定
laravel スケジュール管理のデフォルトタイムゾーンがUTCです。
一つのコマンドに対し、timezone オプションメソッド使います。
$schedule->command('report:generate')
->timezone('Asia/Tokyo')
->at('1:00')
App\Console\Kernel.php ファイルに scheduleTimezone ファンクション追加することで、管理されるすべてのスケジュールに対応
protected function scheduleTimezone()
{
return 'Asia/Tokyo';
}
# タイムゾーン一覧
タイムゾーン一覧
| タイムゾーン ID | タイムゾーン名称 | UTC との時差(単位:時間) |
|---|---|---|
| Africa/Johannesburg | 南アフリカ標準時間 | 2 |
| Africa/Lagos | 西アフリカ時間 | 1 |
| Africa/Windhoek | 西アフリカ時間 | 1 |
| America/Adak | ハワイ - アリューシャン標準時間 | -10 |
| America/Anchorage | アラスカ標準時間 | -9 |
| America/Argentina/Buenos_Aires | アルゼンチン時間 | -3 |
| America/Bogota | コロンビア時間 | -5 |
| America/Caracas | ベネズエラ時間 | -4.5 |
| America/Chicago | 中部標準時間 | -6 |
| America/Denver | 山地標準時間 | -7 |
| America/Godthab | 西グリーンランド時間 | -3 |
| America/Guatemala | 中部標準時間 | -6 |
| America/Halifax | 大西洋標準時間 | -4 |
| America/Los_Angeles | 太平洋標準時間 | -8 |
| America/Montevideo | ウルグアイ時間 | -3 |
| America/New_York | 東部標準時間 | -5 |
| America/Noronha | フェルナンド・デ・ノローニャ時間 | -2 |
| America/Phoenix | 山地標準時間 | -7 |
| America/Santiago | チリ時間 | -4 |
| America/Santo_Domingo | 大西洋標準時間 | -4 |
| America/St_Johns | ニューファンドランド標準時間 | -3.5 |
| Asia/Baghdad | アラビア標準時間 | 3 |
| Asia/Baku | アゼルバイジャン時間 | 4 |
| Asia/Beirut | 東ヨーロッパ時間 | 2 |
| Asia/Dhaka | バングラデシュ時間 | 6 |
| Asia/Dubai | 湾岸標準時間 | 4 |
| Asia/Irkutsk | イルクーツク時間 | 9 |
| Asia/Jakarta | 西インドネシア時間 | 7 |
| Asia/Kabul | アフガニスタン時間 | 4.5 |
| Asia/Kamchatka | ペトロパブロフスクカムチャツキー時間 | 12 |
| Asia/Karachi | パキスタン時間 | 5 |
| Asia/Kathmandu | ネパール時間 | 5.75 |
| Asia/Kolkata | インド標準時間 | 5.5 |
| Asia/Krasnoyarsk | クラスノヤルスク時間 | 8 |
| Asia/Omsk | オムスク時間 | 7 |
| Asia/Rangoon | ミャンマー時間 | 6.5 |
| Asia/Shanghai | 中国標準時間 | 8 |
| Asia/Tehran | イラン標準時間 | 3.5 |
| Asia/Tokyo | 日本標準時間 | 9 |
| Asia/Vladivostok | ウラジオストク時間 | 11 |
| Asia/Yakutsk | ヤクーツク時間 | 10 |
| Asia/Yekaterinburg | エカテリンブルグ時間 | 6 |
| Atlantic/Azores | アゾレス時間 | -1 |
| Atlantic/Cape_Verde | カーボベルデ時間 | -1 |
| Australia/Adelaide | 中部標準時間(南オーストラリア) | 9.5 |
| Australia/Brisbane | 東部標準時間(クイーンズランド) | 10 |
| Australia/Darwin | 中部標準時間(ノーザンテリトリー) | 9.5 |
| Australia/Eucla | 中西部標準時間(オーストラリア) | 8.75 |
| Australia/Lord_Howe | ロードハウ島標準時間 | 10.5 |
| Australia/Sydney | 東部標準時間(ニューサウスウェールズ) | 10 |
| Etc/GMT+12 | GMT-12:00 | -12 |
| Europe/Berlin | 中部ヨーロッパ時間 | 1 |
| Europe/London | グリニッジ標準時間 | 0 |
| Europe/Moscow | モスクワ標準時間 | 4 |
| Pacific/Apia | 西サモア時間 | 13 |
| Pacific/Auckland | ニュージーランド標準時間 | 12 |
| Pacific/Chatham | チャタム標準時間 | 12.75 |
| Pacific/Easter | イースター島時間 | -6 |
| Pacific/Gambier | ガンビア時間 | -9 |
| Pacific/Honolulu | ハワイ標準時間 | -10 |
| Pacific/Kiritimati | ライン諸島時間 | 14 |
| Pacific/Majuro | マーシャル島時間 | 12 |
| Pacific/Marquesas | マルケサス時間 | -9.5 |
| Pacific/Norfolk | ノーフォーク時間 | 11.5 |
| Pacific/Noumea | ニューカレドニア時間 | 11 |
| Pacific/Pago_Pago | サモア標準時間 | -11 |
| Pacific/Pitcairn | ピトケルン島標準時間 | -8 |
| Pacific/Tongatapu | トンガ時間 | 13 |
| UTC | 協定世界時間 | 0 |
# タスク出力
予定通りにタスクが動いてるかどうか後から調べるときに重宝するメソッドです。
ファイルへ出力
$schedule->command('emails:send')
->daily()
->sendOutputTo($filePath);
$schedule->command('emails:send')
->daily()
->appendOutputTo($filePath);
sendOutputTo メソッドはファイル名を指定しただけでとファイルの上書きを行うので、ファイルに追記していきたい場合は sendOutputTo の第 2 引数を true に設定するか appendOutputTo メソッドを利用してください。
# 指定のメールアドレスへ出力
$schedule->command('report:generate')
->daily()
->sendOutputTo($filePath)
->emailOutputTo('taylor@example.com');
// ゼロ以外の終了コードで終了した場合にのみ出力
$schedule->command('report:generate')
->daily()
->emailOutputOnFailure('taylor@example.com');
# タスクフック
before after メソッド
$schedule->command('emails:send')
->daily()
->before(function () {
// タスクが実行されようとしている
})
->after(function () {
// タスクが実行された
});
onSuccess onFailure メソッド
$schedule->command('emails:send')
->daily()
->onSuccess(function (Stringable $output) {
// タスク成功時…
})
->onFailure(function (Stringable $output) {
// タスク失敗時…
});
コマンドから出力を利用できる場合は、フックのクロージャの定義で$output 引数として Illuminate\Support\Stringable インスタンスを型指定することで、after、onSuccess、または onFailure フックでアクセスできます。
# URL への Ping
タスクの実行前または実行後に、指定する URL に自動的に ping を実行
$schedule->command('emails:send')
->daily()
->pingBefore($url)
->thenPing($url);
$schedule->command('emails:send')
->daily()
->pingOnSuccess($successUrl)
->pingOnFailure($failureUrl);