Skip to content

Laravel 11におけるKernel.phpの代替方法とタスクスケジューリング

問題の背景

以前のLaravelバージョンでは、定期実行タスク(CRONジョブ)のスケジューリング設定はapp/Console/Kernel.phpファイルで管理されていました。しかし、Laravel 11でプロジェクト構造が刷新された結果、このファイルはデフォルトで存在しなくなりました。多くのAIアシスタントや古いチュートリアルではKernel.phpの使用が推奨されているため、新しいバージョンで同等の機能を実現する方法に混乱が生じています。

推奨ソリューション:routes/console.php の使用

Laravel 11以降では、routes/console.phpファイルがタスクスケジューリングの新しい標準的な場所として導入されました。このファイルでスケジュールを定義する方法は以下の通りです:

php
use Illuminate\Support\Facades\Schedule;

// 毎分実行するタスク
Schedule::command('your:signature')->everyMinute();

// 毎日午前3時に実行するタスク
Schedule::command('reports:generate')->dailyAt('03:00');

// カスタムクロージャの実行(10分毎)
Schedule::call(function () {
    // 実行したい処理
})->everyTenMinutes();

この方法の特徴:

  • app/ConsoleディレクトリにKernel.phpを作成する必要がない
  • スケジュール定義が一元化され可読性が向上
  • Laravel 11の公式ドキュメントで推奨された方法

基本構文

php
Schedule::command('コマンドのシグネチャ')->頻度メソッド();

主な頻度メソッド

メソッド実行間隔使用例
everyMinute()毎分->everyMinute()
everyFiveMinutes()5分毎->everyFiveMinutes()
hourly()毎時->hourly()
daily()毎日->daily()
twiceDaily()1日2回->twiceDaily(5, 17)
weekly()毎週->weekly()

代替ソリューション:bootstrap/app.php での定義

より高度なカスタマイズやアプリケーション構造の制御が必要な場合は、bootstrap/app.phpファイルでの定義も可能です:

php
use Illuminate\Console\Scheduling\Schedule;

return Application::configure()
    ->withProviders()
    ->withRouting()
    // スケジュール定義部分
    ->withSchedule(function (Schedule $schedule) {
        $schedule->command('backup:run')->daily();
    })
    ->withMiddleware(/* ... */)
    ->withExceptions(/* ... */)
    ->create();

この方法の適切な使用ケース:

  • アプリケーションのブートストラッププロセス中にスケジュールを動的に設定する必要がある場合
  • 環境によってスケジュールを大幅に変更する必要がある場合
  • 複雑な依存関係解決が必要な高度なセットアップ

重要な注意点

  1. 変更の即時適用

    • routes/console.phpを編集後、即座に変更が反映されます
    • キャッシュクリアは不要ですが、設定ミスがある場合はphp artisan config:clearを実行
  2. CLI実行環境の確認

    bash
    php artisan schedule:test

    上記コマンドでスケジュール定義をテスト可能

  3. 本番環境での実行

    bash
    * * * * * cd /your/project/path && php artisan schedule:run >> /dev/null 2>&1

    サーバーのCRON設定(crontab -e)で上記エントリを追加

参考リソース

Laravel 11では、Kernel.phpの廃止により初期設定の複雑さが軽減され、より直感的なスケジューリング管理が可能になりました。新規プロジェクトではroutes/console.phpの使用が推奨され、既存プロジェクトも段階的な移行が可能です。