Laravel定时任务需在Kernel.php中定义并配置系统Cron:1.在schedule()方法中注册命令、闭包或脚本;2.添加每分钟执行schedule:run的系统Cron;3.启用日志、防重叠、环境限定及时区设置;4.用schedule:list和schedule:run验证。

直接在 app/Console/Kernel.php 的 schedule() 方法里注册任务,并配好服务器上的一条系统 Cron,就能让定时任务稳定跑起来。核心就两件事:代码里写清楚“做什么、什么时候做”,服务器上确保“每分钟有人来问一遍该不该执行”。
1. 在 Kernel.php 里定义任务
打开 app/Console/Kernel.php,找到 schedule() 方法。所有定时逻辑都集中在这里写:
- 调用已有的 Artisan 命令:
$schedule->command('backup:database')->dailyAt('02:00'); - 执行简单逻辑(闭包):
$schedule->call(function () { \Log::info('清理完成'); })->hourly(); - 运行外部脚本:
$schedule->exec('php /path/to/script.php')->everyFiveMinutes();
注意:自定义命令(比如 php artisan make:command SendDailyEmail 创建的)必须先加到 $commands 数组里,再用 $schedule->command('send:daily-email') 注册,否则不会被识别。
2. 配一条系统 Cron 启动调度器
登录服务器,运行 crontab -e,添加这一行(替换路径):
* * * * * cd /your/project/path && /usr/bin/php artisan schedule:run >> /dev/null 2>&1
- 必须用
/usr/bin/php这类绝对路径,不能只写php - 确保
cd到项目根目录,否则 artisan 找不到配置 - 这条 Cron 是唯一需要手动配的系统级定时任务,其余全部交由 Laravel 管理
3. 加上实用保障措施
刚上线时建议加上这些,避免出问题难排查:
- 记录日志:
->sendOutputTo(storage_path('logs/backup.log')) - 防止重复执行(单机):
->withoutOverlapping() - 限定只在生产环境跑:
->environments(['production']) - 指定时区(别依赖服务器 UTC):
->timezone('Asia/Shanghai')
4. 快速验证是否生效
不用等实际时间,立刻检查:
- 看所有任务计划:
php artisan schedule:list(显示下次执行时间) - 手动触发一次调度:
php artisan schedule:run --verbose - 临时改成每分钟执行,确认逻辑本身没问题后再调回正式频率
不复杂但容易忽略。把这四步走稳,Laravel 的定时任务就真正为你所用了。


















