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();
この方法の適切な使用ケース:
- アプリケーションのブートストラッププロセス中にスケジュールを動的に設定する必要がある場合
- 環境によってスケジュールを大幅に変更する必要がある場合
- 複雑な依存関係解決が必要な高度なセットアップ
重要な注意点
変更の即時適用
routes/console.php
を編集後、即座に変更が反映されます- キャッシュクリアは不要ですが、設定ミスがある場合は
php artisan config:clear
を実行
CLI実行環境の確認
bashphp artisan schedule:test
上記コマンドでスケジュール定義をテスト可能
本番環境での実行
bash* * * * * cd /your/project/path && php artisan schedule:run >> /dev/null 2>&1
サーバーのCRON設定(
crontab -e
)で上記エントリを追加
参考リソース
Laravel 11では、Kernel.php
の廃止により初期設定の複雑さが軽減され、より直感的なスケジューリング管理が可能になりました。新規プロジェクトではroutes/console.php
の使用が推奨され、既存プロジェクトも段階的な移行が可能です。