400 0867 457

NEWS/新闻

分享你我感悟

您当前位置> 主页 > 新闻 > 技术开发

Laravel如何配置任务调度?(Cron Job示例)

发表时间:2025-12-25 00:00:00

文章作者:裘德小鎮的故事

浏览次数:

Laravel任务调度需在Kernel.php中注册任务并配置系统cron每分钟执行schedule:run命令;支持链式语法定义频率,需注意环境变量、重复执行及多服务器部署问题。

在 Laravel 中配置任务调度,核心是通过内置的 Scheduler 统一管理定时任务,并借助服务器的 cron 每分钟触发一次 Laravel 的调度命令。不需要为每个任务单独写系统 cron 条目。

1. 在 app/Console/Kernel.php 中定义调度任务

所有定时任务都在 app/Console/Kernel.phpschedule() 方法中注册。Laravel 提供了链式语法,清晰表达频率和逻辑。

例如:

  • $schedule->command('backup:database')->dailyAt('02:00'); —— 每天凌晨 2 点执行自定义 Artisan 命令
  • $schedule->job(new SendNewsletter)->weeklyOn(1, '09:00'); —— 每周一上午 9 点分发 Newsletter 任务(需实现 ShouldQueue
  • $schedule->exec('php /var/www/myapp/artisan inspire')->hourly(); —— 每小时运行一条 shell 命令

2. 配置服务器 Cron(只需一条)

Laravel 调度器本身不会自动运行,它依赖系统 cron 每分钟调用一次 php artisan schedule:run。在服务器上执行:

crontab -e

添加这一行(路径按实际项目调整):

* * * * * cd /var/www/myapp && php artisan schedule:run >> /dev/null 2>&1

✅ 注意:确保 PHP 可执行文件路径正确(如用 /usr/bin/php 替代 php),尤其在共享主机或 Docker 环境中。

3. 运行与调试技巧

开发阶段可手动触发调度,验证逻辑是否正常:

  • php artisan schedule:run —— 手动运行一次(只执行当前时间匹配的任务)
  • php artisan schedule:list —— 查看所有已注册任务及其预计下次运行时间(Laravel 8.73+ 支持)
  • 日志建议:在任务命令或 Job 的 handle() 中加入 Log::info(),或统一配置 schedule:run 输出到日志文件(修改 cron 行末尾)

4. 常见注意事项

避免踩坑的关键点:

  • 环境一致性:确保 APP_ENVAPP_DEBUG 在生产 cron 环境中与预期一致(cron 默认不加载用户 shell 配置,可能缺少 PATH 或环境变量)
  • 避免重复执行:使用 withoutOverlapping() 防止前次任务未结束时被再次触发
  • 多服务器部署:若应用部署在多台机器,需确保只有其中一台运行调度(可用缓存锁或数据库锁控制)
  • 权限问题:确保 web 用户和 cron 运行用户对 storage/logs、storage/framework/cache 等目录有读写权限

基本上就这些。Laravel 的任务调度不是黑盒,本质是“一个 cron + 一个调度器”,配置简单但细节决定成败。

相关案例查看更多