Skip to content

Laravel 11 调度任务配置

问题背景

在新版本 Laravel(特别是 Laravel 11)中,传统的任务调度配置文件发生了变化。开发者在使用过时的教程或AI工具时,通常会看到操作建议指向 app/Console/Kernel.php 文件。但随着 Laravel 11 的结构重构:

  • 旧版本中的 Kernel.php 文件已被移除
  • 项目目录结构进行了精简和优化
  • 官方迁移了调度任务配置位置
  • 继续使用原有方式会导致 Kernel not found 错误

现代解决方案

方案一:使用 routes/console.php(推荐方法)

Laravel 11+ 中替代 Kernel.php 的标准方式

  1. 打开 routes/console.php 文件
  2. 使用 Schedule facade 定义定时任务
  3. 无需手动实例化调度对象
php
// routes/console.php
use Illuminate\Support\Facades\Schedule;

// 每分钟执行一次命令
Schedule::command('emails:send')->everyMinute();

// 每小时执行一次闭包函数
Schedule::call(function () {
    Cache::clear();
})->hourly();

特性:

  • 语法简洁直观
  • 自动加载无需额外配置
  • 支持所有原生调度方法(daily()/weekly()等)
  • 保持路由与调用的逻辑一致性

方案二:通过 bootstrap/app.php 配置

适用于需要框架启动时自定义初始化的场景

php
// bootstrap/app.php
use Illuminate\Console\Scheduling\Schedule;

return Application::configure(basePath: dirname(__DIR__))
    ->withSchedule(function (Schedule $schedule) {
        // 每天凌晨执行任务
        $schedule->command('reports:generate')->daily();
        
        // 自定义频率运行脚本
        $schedule->script('backup-database.php')->everySixHours();
    })
    // ...其他配置
    ->create();

适用场景:

  • 需要包裹其他初始化逻辑时
  • 项目需要高度定制的调度器设置
  • 与底层框架生命周期紧密集成的特殊任务

选型建议

  • 常规任务选择 routes/console.php 更轻量
  • 涉及深层框架集成才需 bootstrap/app.php
  • 两者并存时,实际执行取决于框架初始化顺序

迁移对比指南

旧版本结构Laravel 11+ 替代方案
app/Console/Kernel.phproutes/console.php
$schedule 成员变量Schedule facade 直接调用
Artisan::command()保持不变(仍在路由中定义)

常见问题解决

bash
# 验证调度器设置是否正确
php artisan schedule:list

# 手动触发调度任务
php artisan your-command-signature

注意陷阱

  • Laravel 11 完全移除了 app/Console/Kernel.php
  • 生产环境需确认任务调度进程正常运行
  • 避免在两个配置文件中重复定义相同任务

官方参考资源

实际项目开发中,推荐使用 routes/console.php 配置调度任务,这种模式符合 Laravel 现代化架构思想,能无缝适应后续版本升级迭代。