カテゴリ: Laravel 更新日: 2026/08/07

Laravelスケジューラ徹底解説!複数コマンドを連続・並列で実行する方法

Laravelで複数のコマンドを連続実行・並列実行する方法
Laravelで複数のコマンドを連続実行・並列実行する方法

先生と生徒の会話形式で理解しよう

生徒

「Laravelで毎日決まった時間にメールを送ったり、データを掃除したりしたいのですが、一つずつ設定しないとダメですか?」

先生

「Laravelのタスクスケジューラを使えば、複数の処理をまとめて管理できますよ。順番に実行したり、同時に実行したりすることも自由自在です。」

生徒

「複数の処理を一度に動かすのは難しそうですね。初心者でも設定できますか?」

先生

「大丈夫ですよ。基本的な書き方さえ覚えれば、パソコンの操作に慣れていない方でも簡単に自動化の仕組みを作ることができます。一緒に学んでいきましょう!」

1. Laravelのタスクスケジューラとは?

1. Laravelのタスクスケジューラとは?
1. Laravelのタスクスケジューラとは?

Laravelのタスクスケジューラとは、あらかじめ決めた時間に特定のプログラムを自動で実行してくれる便利な仕組みのことです。例えば、「毎日夜中の3時にバックアップを取る」「1時間おきに最新のニュースを取得する」といった作業を、人間が手動で行わなくてもコンピューターが自動で進めてくれます。

通常、サーバーで定期実行を行うには「Cron(クローン)」という設定ファイルを直接編集する必要がありますが、これは初心者には少しハードルが高い作業です。しかし、Laravelを使えばPHPのコードを書くだけで、直感的にスケジュールを管理できるようになります。これにより、開発効率が劇的に向上し、ミスも減らすことができます。

2. コマンドを連続して実行するメリット

2. コマンドを連続して実行するメリット
2. コマンドを連続して実行するメリット

プログラミングをしていると、一つの作業が終わった直後に、別の作業を続けて行いたい場面が多々あります。これを連続実行と呼びます。例えば、「古いデータを削除した後に、データベースを最適化する」といった流れです。この順番が逆になると、エラーが起きたり、正しく処理されなかったりすることがあります。

連続実行を行う最大のメリットは、処理の「依存関係」を守れることです。前の作業が成功したことを前提に次の作業へ進むため、データの整合性を保ちながら安全にプログラムを動かすことができます。Laravelのスケジューラでは、こうした「順番待ち」の指示も非常にシンプルに記述することが可能です。

3. 複数のコマンドを順番に実行する書き方

3. 複数のコマンドを順番に実行する書き方
3. 複数のコマンドを順番に実行する書き方

それでは実際に、複数のコマンドを順番に実行させるコードを見ていきましょう。Laravelでは、app/Console/Kernel.php(または新しいバージョンでは routes/console.php)という場所に設定を記述します。ここでは、一日の終わりに「ログの整理」と「レポートの作成」を順番に行う例を紹介します。


use Illuminate\Support\Facades\Schedule;

// 毎日深夜0時に、2つの処理を順番に実行する設定
Schedule::command('app:clear-logs')
    ->daily()
    ->then(function () {
        // ログ削除が終わった後に実行される
        Schedule::command('app:generate-report')->runNow();
    });

上記のコードでは、まず app:clear-logs という命令が動きます。その処理が完了したことを確認してから、then というブロックの中にある app:generate-report が動き出します。このように書くことで、前の処理が終わるのを待ってから次へ進むという「列に並んで順番を待つ」ような動きを実現できます。

4. 並列実行で処理時間を短縮する方法

4. 並列実行で処理時間を短縮する方法
4. 並列実行で処理時間を短縮する方法

一方で、それぞれの作業が独立していて、順番を待つ必要がない場合もあります。この時に役立つのが並列実行です。並列実行とは、複数の作業を「せーの」で同時に開始することを指します。例えば、「Aさんにメールを送る」のと「Bさんのデータを更新する」のは、お互いに関係がないため同時に行っても問題ありません。

並列実行の利点は、全体の処理時間を大幅に短縮できることです。1つ1分かかる処理を5つ順番に行うと5分かかりますが、5つ同時に行えば理論上は1分で終わります。Laravelでは runInBackground() という命令を使うことで、この並列実行を簡単に実現できます。


use Illuminate\Support\Facades\Schedule;

// 5分おきに、複数の処理を同時に開始する
Schedule::command('emails:send-user-a')->everyFiveMinutes()->runInBackground();
Schedule::command('emails:send-user-b')->everyFiveMinutes()->runInBackground();
Schedule::command('emails:send-user-c')->everyFiveMinutes()->runInBackground();

この runInBackground() を付けることで、最初のコマンドの終了を待たずに、次のコマンドが即座に呼び出されます。まるで複数のスタッフが手分けして作業を進めるようなイメージです。

5. 初心者が知っておきたいバックグラウンド実行の注意点

5. 初心者が知っておきたいバックグラウンド実行の注意点
5. 初心者が知っておきたいバックグラウンド実行の注意点

並列実行(バックグラウンド実行)は非常に強力ですが、注意点もあります。同時にたくさんの処理を動かしすぎると、サーバーという「コンピューターの脳みそ」に大きな負担がかかってしまいます。一度に100個もの重たい作業を同時にさせようとすると、サーバーがパンクして動かなくなることもあるのです。

また、同じデータに対して同時に変更を加えようとすると、データが壊れてしまう「衝突」が起きる可能性もあります。そのため、「この作業は他の作業と関係があるか?」を常に考え、独立している作業だけを並列にするのがプログラミングのコツです。まずは安全な連続実行から試してみて、慣れてきたら並列実行に挑戦するのが良いでしょう。

6. 実際のプロジェクトでよく使う設定例

6. 実際のプロジェクトでよく使う設定例
6. 実際のプロジェクトでよく使う設定例

ここでは、より実践的な例として、データベースのバックアップと、完了後の通知を組み合わせた設定を見てみましょう。ここでは、バックアップという重い処理を行い、それが終わったら管理者に「終わりましたよ!」と知らせる仕組みを作ります。


use Illuminate\Support\Facades\Schedule;

// 毎週月曜日の朝6時に実行
Schedule::command('db:backup')
    ->weeklyOn(1, '06:00')
    ->onSuccess(function () {
        // バックアップが成功した時だけ通知を送る
        Schedule::command('notify:admin-success')->runNow();
    })
    ->onFailure(function () {
        // もし失敗してしまったら、緊急アラートを出す
        Schedule::command('notify:admin-failure')->runNow();
    });

この例では onSuccess(成功したとき)と onFailure(失敗したとき)という便利な機能を使っています。ただ順番に動かすだけでなく、「もしダメだったらこうする」という条件を付け加えることで、より賢い自動化システムを作ることができます。これは、初心者から中級者へステップアップするために欠かせない考え方です。

7. メンテナンスモード中の実行制御

7. メンテナンスモード中の実行制御
7. メンテナンスモード中の実行制御

Webサイトを更新している時など、サイトを一時的に閉鎖する「メンテナンスモード」という状態があります。この間、勝手にスケジュールが動いてしまうと困る場合があります。Laravelでは、メンテナンス中であっても強制的に動かしたい処理を指定することができます。


use Illuminate\Support\Facades\Schedule;

// メンテナンス中でも、セキュリティチェックだけは欠かさず行う
Schedule::command('security:check')
    ->hourly()
    ->evenInMaintenanceMode();

逆に、何も指定しなければ、Laravelはメンテナンス中にスケジュールを実行しません。これにより、サイトが止まっている間に古いデータが更新されてしまうといったトラブルを防ぐことができます。こうした細やかな配慮が、Laravelが世界中で愛されている理由の一つです。

8. スケジュールの動作確認をする方法

8. スケジュールの動作確認をする方法
8. スケジュールの動作確認をする方法

設定を書いた後、本当に正しく動くかどうか不安になりますよね。そんな時は、パソコンの画面(ターミナルやコマンドプロンプト)で、今どのようなスケジュールが登録されているかを確認できる魔法の言葉があります。それが php artisan schedule:list です。

これを入力して実行すると、次のような結果が表示されます。


+------------------+-------------+--------------------+----------------------------+
| Command          | Interval    | Description        | Next Run                   |
+------------------+-------------+--------------------+----------------------------+
| app:clear-logs   | 0 0 * * *   | ログの削除処理      | 2026-04-01 00:00:00 +09:00 |
| emails:send-user | */5 * * * * | メール送信処理      | 2026-03-31 19:00:00 +09:00 |
+------------------+-------------+--------------------+----------------------------+

この表を見ることで、「どのコマンドが」「どのくらいの間隔で」「次はいつ動くのか」が一目でわかります。初心者の方は、まずこのリストを表示させてみて、自分の書いた設定が反映されているかチェックすることから始めてみましょう。エラーが出ていないかを確認するのも、立派なプログラミングの第一歩です。

9. ログを活用してトラブルを解決する

9. ログを活用してトラブルを解決する
9. ログを活用してトラブルを解決する

プログラムが自動で動くようになると、自分の見ていないところでエラーが起きていないか心配になるものです。そんな時は、実行した結果を「日記」のように保存しておくことができます。これをログ出力と呼びます。Laravelのスケジューラには、その結果をファイルに書き出す機能が備わっています。


use Illuminate\Support\Facades\Schedule;

// 実行結果を専用のファイルに書き残す
Schedule::command('app:sync-data')
    ->daily()
    ->appendOutputTo(storage_path('logs/sync_results.log'));

appendOutputTo という指示を使うと、処理が終わるたびに指定したファイルへ結果が追記されていきます。後でそのファイルを開けば、「昨日の夜は無事に終わったかな?」と確認することができます。パソコンを触ったことがない方でも、メモ帳で日記を読むのと同じ感覚でチェックできるので安心してください。こうした確認作業を繰り返すことで、システムの信頼性を高めていくことができます。

まとめ

まとめ
まとめ

Laravelのタスクスケジューラを使いこなすことは、モダンなWebアプリケーション開発において非常に重要なスキルです。これまでに学んできたように、単一のコマンド実行から、複数のコマンドを組み合わせた高度な自動化まで、Laravelは非常にシンプルかつ強力なインターフェースを提供しています。手動での作業を減らし、ヒューマンエラーを排除することで、システムの信頼性は飛躍的に向上します。

連続実行と並列実行の使い分け

タスクを自動化する際、最も考慮すべき点は「実行順序」と「リソース」のバランスです。連続実行は、データの整合性を保つ必要がある場合に最適です。例えば、古いデータをアーカイブした後に削除する、あるいはバックアップが完了した後に通知を送るといったケースです。これに対し、並列実行(runInBackground)は、互いに依存関係のない独立したタスクを短時間で終わらせたい場合に威力を発揮します。

安全な運用のためのテクニック

実際の運用現場では、ただ動かすだけでなく「失敗に備える」ことが欠かせません。onSuccessonFailureを活用して異常を検知する仕組みを構築しましょう。また、withoutOverlappingメソッドを使用すれば、前の処理が終わっていないのに次の同じ処理が重なって起動してしまう「二重起動」を防ぐことができます。これは、処理時間が予想外に長引いた際のサーバー負荷増大やデータ破損を防ぐための必須テクニックです。


use Illuminate\Support\Facades\Schedule;

// 重複実行を防止しつつ、1分ごとに実行する設定
Schedule::command('app:heavy-task')
    ->everyMinute()
    ->withoutOverlapping();

スケジュールの可視化とデバッグ

開発中は、php artisan schedule:listコマンドを頻繁に利用して、現在の登録状況を把握する癖をつけましょう。また、実行ログをemailOutputToでメール送信したり、appendOutputToでファイルに保存したりすることで、夜間に発生したサイレントなエラーを見逃さない体制を整えることができます。

最後に、以下に実戦で使える「複数タスクの統合管理」のサンプルコードを掲載します。これを参考に、自身のプロジェクトに合わせてカスタマイズしてみてください。

実践的なスケジュール定義の例

use Illuminate\Support\Facades\Schedule;

// 毎朝7時に実行される一連の処理
Schedule::command('data:import')
    ->dailyAt('07:00')
    ->onSuccess(function () {
        // インポート成功後、集計処理を順番に実行
        Schedule::command('data:summarize')->runNow();
    })
    ->onFailure(function () {
        // 失敗時は即座にSlack等へ通知(カスタムコマンドの例)
        Schedule::command('slack:notify-error "Import Failed"')->runNow();
    });

// ユーザーへの通知送信は個別に並列で実行
Schedule::command('notify:users-morning')
    ->dailyAt('08:00')
    ->runInBackground();
先生と生徒の振り返り会話

生徒

「先生、ありがとうございました!タスクスケジューラを使うと、今まで手動でやっていた作業が全部自動化できそうな気がしてきました。特に、前の処理が終わってから次の処理を動かす thenonSuccess の使い方がすごく分かりやすかったです。」

先生

「それは良かったです。順番に実行させることで、データの不整合を防げるのが大きなメリットですね。実際に使ってみて、何か気になったところはありますか?」

生徒

「はい、並列実行の runInBackground() についてです。これを使えば何でも速くなる気がしますが、使いすぎは良くないんですよね?」

先生

「鋭いですね。並列実行は便利ですが、同時に動くプログラムの数だけCPUやメモリを消費します。お料理に例えると、コンロが4つしかないのに、10個の鍋を一度に火にかけようとするようなものです。サーバーのスペックに合わせて、本当に同時に動かす必要があるものだけを厳選するのがコツですよ。」

生徒

「なるほど、サーバーの限界も考えないといけないんですね。あと、メンテナンスモードの時の話も印象的でした。ユーザーがサイトを使えない間でも、裏側でセキュリティチェックだけは動かし続ける設定は、プロの現場っぽくてかっこいいなと思いました!」

先生

「ははは、そうですね。運用の安定性を考えるのがエンジニアの腕の見せ所です。まずは php artisan schedule:list を叩いて、今の設定がどうなっているか眺めるところから始めてみてください。実際にリストとして表示されると、自分の書いたコードが生きている実感が湧きますよ。」

生徒

「わかりました!まずは簡単なログ掃除から自動化に挑戦してみます。エラーが出ても、ログ出力の設定をしておけば怖くないですね!」

先生

「その意気です。失敗を恐れず、一歩ずつ自動化の範囲を広げていきましょう。Laravelのスケジューラは、あなたの強力な味方になってくれるはずです。」

カテゴリの一覧へ
新着記事
New1
Laravel
Laravelのルートとコントローラを対応付ける方法(名前付きルート)を初心者向けに解説
New2
Symfony
Symfonyで画像やファイルをアップロードする時のバリデーション完全ガイド!初心者でもわかる入力チェックの基本
New3
Laravel
Laravelで言語切替UIを作る!多言語対応(ローカリゼーション)実践ガイド
New4
CodeIgniter
CodeIgniterでローカル開発環境を構築する方法!初心者向け完全ガイド
人気記事
No.1
Java&Spring記事人気No1
CodeIgniter
CodeIgniterのキャッシュ管理を完全ガイド!初心者でもわかるメリットと注意点
No.2
Java&Spring記事人気No2
Symfony
Symfony学習に役立つおすすめドキュメント・教材・リソース一覧【初心者向け】
No.3
Java&Spring記事人気No3
Laravel
Laravelのプロジェクト構造を理解しよう!初心者向けディレクトリ解説
No.4
Java&Spring記事人気No4
CodeIgniter
CodeIgniterとは?特徴・できること・他PHPフレームワークとの違いを完全解説
No.5
Java&Spring記事人気No5
Laravel
Laravelローカリゼーション入門!言語の取得と切り替え(App::getLocale / setLocale)を徹底解説
No.6
Java&Spring記事人気No6
CodeIgniter
CodeIgniterのビュー共通化ガイド!初心者でもわかる部分ビューの読み込みとinclude設計
No.7
Java&Spring記事人気No7
Laravel
Laravelの条件分岐とループ処理をBladeで書く方法
No.8
Java&Spring記事人気No8
Symfony
TwigのHTMLエスケープとrawフィルタの使い方を完全解説!初心者にもわかるテンプレート表示のコツ