首页 > PHP > Laravel教程 任务调度

Laravel教程 任务调度

2025-03-07 15:23:09

以下是在原有教程基础上增加 作用介绍 的详细说明,帮助理解每个配置的意义和适用场景:


一、Laravel 任务调度示例代码(附作用说明)

1. 定义调度任务的作用

任务调度的核心是通过代码定义周期性执行的操作,替代手动维护服务器Cron任务的复杂性。Laravel的调度器通过优雅的语法封装了Cron表达式,使得任务管理更易读、更集中。


2. 代码示例详解

在 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);

二、服务器Cron配置(附作用说明)

1. 为什么需要配置服务器Cron?

Laravel的调度器本身不自动运行,需要服务器通过Cron每分钟调用一次 schedule:run 命令。此命令会检查当前时间是否有任务需要执行,相当于一个“触发器”。

2. Cron配置示例

* * * * * cd /项目路径 && php artisan schedule:run >> /dev/null 2>&1
  • 作用:每分钟进入项目目录,执行Laravel调度检查。
  • 路径要求:必须指向Laravel根目录,否则无法加载框架。
  • 输出处理>> /dev/null 表示忽略输出(生产环境建议记录到日志文件)。

三、高级配置的作用解析

1. 环境限制

$schedule->command('emails:send')->daily()->environments(['production']);
  • 作用:防止开发或测试环境误执行生产任务(如发送真实邮件)。

2. 任务监控(Laravel Pulse)

composer require laravel/pulse
  • 作用:可视化监控任务执行状态、耗时及失败记录,便于快速定位问题。

3. 共享主机方案

// routes/web.php
Route::get('/scheduler-run', function () {
    if (request('token') === env('SCHEDULER_TOKEN')) {
        Artisan::call('schedule:run');
        return 'Scheduler executed!';
    }
    abort(403);
});
  • 作用:通过外部Web请求触发调度器,解决无Cron权限的问题。
  • 安全建议:必须使用Token验证,避免URL被恶意调用。

四、验证调度任务(关键步骤说明)

1. 手动运行测试

php artisan schedule:run
  • 作用:立即触发所有到期的任务,快速验证代码是否正确。

2. 查看任务列表

php artisan schedule:list
  • 输出示例
    2024-05-20 14:00:00 每小时 执行 call 闭包
    2024-05-21 00:00:00 每天  执行 command 'sanctum:prune-expired'
    
  • 作用:清晰展示所有已注册任务的下次运行时间,确认调度规则是否生效。

五、核心概念总结

功能 作用
调度频率方法 用语义化方法(如daily())替代复杂Cron表达式,提升可读性
withoutOverlapping 避免长时间任务重复执行,保证单一实例运行
时区设置 确保任务在服务器的物理时间之外,按业务时区准确触发
日志记录 通过appendOutputTosendOutputTo记录任务输出,便于后续审计
任务锁机制 基于缓存实现的任务锁,防止多服务器环境下重复执行

通过理解每个配置的作用,开发者可以更灵活地根据业务需求定制调度任务,同时掌握问题排查的关键点。

使用 Ctrl+D 可将网站添加到书签
收藏网站
扫描二维码
关注早实习微信公众号
官方公众号
Top