以下是在原有教程基础上增加 作用介绍 的详细说明,帮助理解每个配置的意义和适用场景:
任务调度的核心是通过代码定义周期性执行的操作,替代手动维护服务器Cron任务的复杂性。Laravel的调度器通过优雅的语法封装了Cron表达式,使得任务管理更易读、更集中。
在 app/Console/Kernel.php
的 schedule
方法中:
// 示例1:清理过期Token(适合API认证场景)
// 作用:每天凌晨自动清理Sanctum生成的过期Token,避免数据库膨胀
$schedule->command('sanctum:prune-expired --hours=24')->daily();
// 示例2:闭包执行队列任务(适合轻量级操作)
// 作用:每小时触发一个队列任务(如发送提醒邮件),闭包适合快速定义简单逻辑
$schedule->call(function () {
\App\Jobs\SendReminderEmails::dispatch();
})->hourly();
// 示例3:执行Shell命令(适合系统级操作)
// 作用:每5分钟备份数据库,输出日志到指定文件,适用于维护关键数据
$schedule->exec('mysqldump -u user -p password dbname > backup.sql')
->everyFiveMinutes()
->sendOutputTo(storage_path('logs/backup.log'));
// 示例4:定时任务类(适合复杂业务)
// 作用:每周一8点生成周报,使用Job类封装复杂逻辑,timezone确保时区准确
$schedule->job(new \App\Jobs\GenerateWeeklyReport())
->weekly()->mondays()->at('8:00')->timezone('Asia/Shanghai');
// 示例5:防止任务重叠(适合耗时任务)
// 作用:每分钟发送邮件,但避免前一个任务未完成时启动新实例,5分钟为最大锁定时间
$schedule->command('emails:send')->everyMinute()->withoutOverlapping(5);
Laravel的调度器本身不自动运行,需要服务器通过Cron每分钟调用一次 schedule:run
命令。此命令会检查当前时间是否有任务需要执行,相当于一个“触发器”。
* * * * * cd /项目路径 && php artisan schedule:run >> /dev/null 2>&1
>> /dev/null
表示忽略输出(生产环境建议记录到日志文件)。$schedule->command('emails:send')->daily()->environments(['production']);
composer require laravel/pulse
// routes/web.php
Route::get('/scheduler-run', function () {
if (request('token') === env('SCHEDULER_TOKEN')) {
Artisan::call('schedule:run');
return 'Scheduler executed!';
}
abort(403);
});
php artisan schedule:run
php artisan schedule:list
2024-05-20 14:00:00 每小时 执行 call 闭包
2024-05-21 00:00:00 每天 执行 command 'sanctum:prune-expired'
功能 | 作用 |
---|---|
调度频率方法 | 用语义化方法(如daily() )替代复杂Cron表达式,提升可读性 |
withoutOverlapping | 避免长时间任务重复执行,保证单一实例运行 |
时区设置 | 确保任务在服务器的物理时间之外,按业务时区准确触发 |
日志记录 | 通过appendOutputTo 或sendOutputTo 记录任务输出,便于后续审计 |
任务锁机制 | 基于缓存实现的任务锁,防止多服务器环境下重复执行 |
通过理解每个配置的作用,开发者可以更灵活地根据业务需求定制调度任务,同时掌握问题排查的关键点。