# 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

関連記事

Laravel でカテゴリー作成 テーブル構築と再帰クエリ
Laravel Queue で非同期処理
Laravel notification メール通知カスタマイズ
Laravel lang バリデーションメッセージを多言語対応
Laravel を API サーバーとしての初期設定
Laravel リクエストログ出力
Carbon で php date 日付の日数・月数差を計算
Laravel 429 Too Many Requests
Laravel Email バリデーションについて
Laravel Sanctum 使って API トークン JWT 認証と SPA 認証
AWS SES メール開封確認  DB に集計
Laravel logger でエラーログを chatwork に自動送信
php CSV データ取得は fgetcsv 使う
Laravel tinker 使って DB データベース接続とコマンド
Laravel Test についてのメモ
Laravel Log の基本設定&使い方
Exception: Class 'ZipArchive' not found
Laravel Sail で Docker 環境構築
PHP 文字列長さ・文字列の幅を取得方法
Codeigniter 画像アップロードとリサイズ
Laravel Lumen Faker 日本語設定
laravel method の基本 get post put options
Class 'Imagick' not found Error
Laravel eloquent model の規約
PHP mbconvertkana 全角半角英数カナ変換
Codeigniter APPPATH BASEPATH FCPATH 各種パスと URL 取得
Laravel timestamp() auto update 有効化無効化
Lumen8 で JWT ユーザー認証
Laravel toSql パラメータ付きで出力
Lumen8 で API 開発
php Exception エラーキャッチでメール送信
Smarty HTTP URL 取得できるサーバー関数
Laravel blade foreach loop と current url
laravel session を制する
PHP empty isset is_null の違い
PHP 8 リリース新機能と変更
FlattenException deprecated
php.ini 初期設定のいろいろ
Laravel 5.1 から 8.1 にバージョンアップ
PHP 7.4 にアップグレードして使えなくなる機能
開発時によく使うゼロ埋めパディング作業まとめ
解決!phpMyAdmin テーブル構造の内容が表示されない問題
codeigniter email ライブラリでメール送信 日本語対応
Composer コマンドとオプション
爆速軽量フレームワーク codeigniter PHP 開発
nuxtjs と codeigniter で jwt システム構築
Lumen と Laravel 違い比較
HTML から PDF に変換 PHP ライブラリ mPDF の設定
twig 3 人気 PHP テンプレートエンジンがバージョンアップ
正規表現一覧 よく使う検索・置換のパターン
Apache 初期設定メモ
開発におけるコーディングルール・規約
Laravel Error についてのメモ
laravel に vuejs 使うための初期設定
php curl 使って クリックなしで POST 送信
allowurlinclude の設定で ftp_connect()エラー