Laravelスケジューラ入門!曜日や時間を指定して定期実行する方法を解説
生徒
「Laravelで、毎週月曜日の朝に自動でお知らせメールを送るような仕組みを作りたいのですが、可能ですか?」
先生
「はい、もちろんです。Laravelにはタスクスケジューラという便利な機能があって、曜日や時間を細かく指定してプログラムを自動実行できますよ。」
生徒
「特定の曜日だけ動かしたり、特定の時間帯だけ動かしたりする設定も簡単にできるんでしょうか?」
先生
「直感的な命令文を使うだけで、驚くほど簡単に設定できます。まずは基本から一緒に学んでいきましょう!」
1. Laravelのタスクスケジューラとは?
Laravelのタスクスケジューラとは、あらかじめ決めた時間にプログラムを自動で動かすための仕組みです。 一般的なサーバーでは「Cron(クロン)」という機能を使って定期実行を行いますが、本来はサーバーの設定ファイルを直接書き換える必要があり、初心者には少しハードルが高い作業でした。
しかし、Laravelを使えば、PHPのコードを書くだけで実行タイミングを管理できます。 例えば、「毎日夜中の3時にデータを整理する」「毎週月曜日の朝9時にレポートを作成する」といった指示を、非常に読みやすい形式で記述できるのが特徴です。 プログラム未経験の方でも、これから紹介する専用の命令(メソッド)を覚えるだけで、システムを自動化するプロフェッショナルな機能を手に入れることができます。
2. スケジュール設定の基本構造
Laravelで定期実行のルールを書く場所は、通常 routes/console.php というファイルです。
(※バージョンによっては app/Console/Kernel.php の場合もあります)。
ここに、「何を」「いつ」実行するかを記述します。
最もシンプルな書き方は、クロージャと呼ばれる無名の関数を使って、その中に実行したい処理を直接書く方法です。 まずは、1分ごとに実行される基本的な形を確認してみましょう。
use Illuminate\Support\Facades\Schedule;
Schedule::call(function () {
// ここに実行したい処理を書きます
\Log::info('1分ごとにログを出力します');
})->everyMinute();
上記のコードにある everyMinute() が「いつ」にあたる部分で、「毎分実行する」という意味になります。
この部分を別の命令に書き換えることで、曜日や時間を自由自在に操ることができるようになります。
3. 曜日を指定して実行する mondays メソッド
「毎週月曜日だけ処理を動かしたい」というケースは非常に多いです。
例えば、週の始まりに在庫チェックを行ったり、ユーザーに一週間の目標を通知したりする場合です。
Laravelでは mondays() という命令を使うだけで、月曜日限定のスケジュールが組めます。
この命令を使うと、他の曜日には一切反応せず、月曜日の間だけ指定した間隔で動作します。 通常は、後述する時間の指定と組み合わせて「月曜日の何時」という形で利用するのが一般的です。
Schedule::call(function () {
// 月曜日だけ実行される処理
\Log::info('今日は月曜日です。今週も頑張りましょう!');
})->mondays();
同様に、火曜日なら tuesdays()、水曜日なら wednesdays() と、英語の曜日名の複数形をメソッドとして呼び出すことができます。
直感的に理解できるので、英語が苦手な方でも覚えやすい設計になっています。
4. 曜日と時間をセットで指定する weeklyOn メソッド
特定の曜日の、さらに特定の時間に実行したい場合は weeklyOn() メソッドが非常に便利です。
このメソッドは、2つの情報を括弧の中に書きます。1つ目は「何曜日か(0から6の数字、または曜日定数)」、2つ目は「何時何分か」です。
例えば、「毎週水曜日の午後3時(15時)ちょうど」に実行したい場合は次のように書きます。
Schedule::call(function () {
// 毎週水曜日の15:00に実行
\Log::info('水曜午後の定期メンテナンスを開始します');
})->weeklyOn(3, '15:00');
曜日の指定に使う数字は、0が日曜日、1が月曜日、2が火曜日……という順番になっています。
数字で指定するのが不安な場合は、可読性を高めるために Schedule::WEDNESDAY のような書き方もできますが、まずは数字や文字列での指定に慣れておくと良いでしょう。
5. 特定の時間帯だけ実行する設定方法
「平日の日中だけ実行したい」や「深夜の時間帯だけ動かしたい」といった、時間帯の幅を指定したいこともあります。
その時に役立つのが between() や unlessBetween() です。
例えば、「毎日、朝の9時から夕方の18時までの間だけ、1時間おきに実行する」という設定は以下のようになります。
Schedule::call(function () {
// 9:00から18:00の間だけ、1時間ごとに実行
\Log::info('業務時間内の定期チェックです');
})->hourly()->between('9:00', '18:00');
このように、複数の命令を「->(アロー演算子)」でつなげていくことを「メソッドチェーン」と呼びます。 Laravelのスケジューラは、このメソッドチェーンを駆使することで、複雑な条件をまるで文章を作るように組み立てることができるのです。
6. 土日だけ実行する便利な短縮命令
業務用のシステムであれば「土日は動かしたくない」、逆に個人のサービスであれば「土日だけ特別なイベントを発生させたい」といった要望があります。 Laravelには、週末や平日を判定する専用の命令も用意されています。
-
weekdays():月曜日から金曜日(平日)のみ実行 -
weekends():土曜日と日曜日(週末)のみ実行
これらを使うことで、カレンダーの曜日を一つずつ指定する手間が省けます。 例えば、週末の土日にだけユーザーへポイントを付与するような処理を書きたいときは、以下のように記述します。
Schedule::call(function () {
// 土曜日と日曜日だけ実行される
\Log::info('週末限定キャンペーンの処理を実行しました');
})->daily()->weekends();
daily() は「毎日」という意味ですが、その後に weekends() をつなげることで「毎日実行しようとするけれど、週末のときだけね」というフィルタリングが行われます。
7. タイムゾーンの設定に注意しよう
スケジューラを使う上で、最も初心者がつまずきやすいポイントが「タイムゾーン」です。 タイムゾーンとは、どこの国の時間を基準にするかという設定のことです。 デフォルトの設定が海外(UTCなど)になっていると、日本時間の午前9時に実行したいつもりが、実際には夜中に動いてしまうといったズレが生じます。
Laravel全体の時間を日本時間にするには、config/app.php ファイル内の 'timezone' => 'UTC' を 'Asia/Tokyo' に変更します。
もし、特定のスケジュールだけタイムゾーンを変えたい場合は、コード内で timezone('Asia/Tokyo') と指定することも可能です。
パソコンを触ったことがない方にとって「標準時」という概念は少し難しいかもしれませんが、「時計の基準を日本に合わせる作業が必要なんだな」と覚えておけば大丈夫です。
8. 定期実行が動いているか確認する方法
プログラムを書いただけでは、実はまだ自動で動き出しません。 本来はサーバー側で「Laravelのスケジューラを動かしてね」という設定が必要ですが、開発中や練習中であれば、自分のパソコンでコマンドを入力して動作テストができます。
パソコンの「ターミナル(コマンドプロンプト)」を開いて、プロジェクトのフォルダで以下の魔法の言葉を入力してみましょう。
php artisan schedule:list
このコマンドを打つと、今どんなスケジュールが登録されていて、次にいつ動く予定なのかが一覧で表示されます。 「実行結果」のイメージは以下のようになります。
Next Run Command
2026-04-06 00:00:00 Closure at: routes/console.php:15
このように、次に動く時間が正しく表示されていれば、あなたの書いたスケジュール設定は成功です! 未経験の方でも、このリストが見られるようになれば、もう立派な開発者の第一歩を踏み出しています。
まとめ
今回の記事では、Laravelのタスクスケジューラを使用して、曜日や時間を指定して処理を定期実行する方法について詳しく解説してきました。 プログラミング初学者の方や、これまでサーバーのCron設定に苦戦していた方にとって、Laravelのスケジューラは非常に強力な味方になります。 PHPのコードだけで直感的にスケジュールを管理できるため、保守性が高く、チーム開発においても設定内容が一目でわかるという大きなメリットがあります。
定期実行の設定メソッド一覧
これまでに学んだ主要なメソッドを整理しましょう。これらのメソッドを組み合わせることで、複雑な実行条件も簡単に構築できます。
| メソッド名 | 実行タイミングの説明 |
|---|---|
everyMinute() |
毎分(1分ごと)に実行します。テスト時に便利です。 |
hourly() |
毎時(1時間ごと)に実行します。 |
daily() |
毎日深夜0時に実行します。日次レポートなどに最適です。 |
mondays() |
毎週月曜日のみ実行します。週の始まりの処理に使います。 |
weekdays() |
平日の月曜日から金曜日まで実行します。業務システム向きです。 |
weekends() |
土曜日と日曜日のみ実行します。休日限定の処理に便利です。 |
weeklyOn(1, '08:00') |
特定の曜日の指定時刻に実行します(例:月曜の朝8時)。 |
実践的なコード例:複数の条件を組み合わせる
実際の開発現場では、単一のメソッドだけでなく、複数の条件をチェーンさせて「特定の期間だけ動かす」といった制御をよく行います。 例えば、「平日の月曜日から金曜日の間、朝9時から夜18時まで、1時間おきに在庫確認メールを送信する」という設定は以下のようになります。
use Illuminate\Support\Facades\Schedule;
// 業務時間内の平日のみ、1時間ごとに実行する例
Schedule::call(function () {
// 在庫確認や通知処理のロジック
\Log::info('平日業務時間内の定期処理を実行しました');
})->hourly()
->weekdays()
->between('9:00', '18:00');
デバッグと動作確認の重要性
スケジュールを記述した後は、必ず php artisan schedule:list コマンドを使用して、意図した時間に実行予定が入っているか確認する癖をつけましょう。
また、ログ出力(Log::info)を活用することで、実際にその時間に処理が走ったかどうかを後から追いかけることができます。
特に本番環境へデプロイする前には、タイムゾーンの設定が config/app.php で 'Asia/Tokyo' になっているかを再確認することが、トラブルを防ぐ最大のポイントです。
Laravelのスケジューラをマスターすれば、バックアップの自動化、メールの予約配信、外部APIからのデータ取得など、システム運用に欠かせない多くのタスクを自動化できるようになります。
最初は簡単な everyMinute() から始めて、徐々に複雑なスケジュール設定に挑戦してみてください。
生徒
「先生、ありがとうございました!曜日や時間を指定する方法がよくわかりました。思っていたよりもずっとシンプルに書けるんですね。」
先生
「そうですね。Laravelの設計思想は『表現力豊かで、読みやすいコード』ですから、初心者の方でもメソッド名を見るだけで何をしているか理解しやすいのが魅力です。」
生徒
「さっそく weeklyOn を使って、月曜日の朝に動くプログラムを作ってみました。でも、自分のパソコンを閉じている間も動くんですか?」
先生
「良い質問です!自分のパソコンで開発している間は、パソコンが起動していて、かつ手動でコマンドを打たない限り勝手には動きません。実際に運用するときは、サーバーという24時間動いているコンピュータに設定を任せることになります。」
生徒
「なるほど、まずは自分の環境で schedule:list を使って、正しく登録されているか確認するところから練習してみます!」
先生
「その意気です。まずは Log::info を使って、ログファイルに文字が書き込まれるのを見るだけでも感動しますよ。一歩ずつ自動化の楽しさを味わっていきましょうね。」
生徒
「はい!タイムゾーンの設定も忘れずにチェックしておきます。これで深夜に叩き起こされる心配もなさそうです(笑)」