# 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);
2021-12-01
  • php
  • laravel

同じタグを持つ記事をピックアップしました。