Laravel任务调度需在Kernel.php中注册任务并配置系统cron每分钟执行schedule:run命令;支持链式语法定义频率,需注意环境变量、重复执行及多服务器部署问题。
在 Laravel 中配置任务调度,核心是通过内置的 Scheduler 统一管理定时任务,并借助服务器的 cron 每分钟触发一次 Laravel 的调度命令。不需要为每个任务单独写系统 cron 条目。
所有定时任务都在 app/Console/Kernel.php 的 schedule() 方法中注册。Laravel 提供了链式语法,清晰表达频率和逻辑。
例如:
—— 每周一上午 9 点分发 Newsletter 任务(需实现 ShouldQueue)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 环境中。
开发阶段可手动触发调度,验证逻辑是否正常:
handle() 中加入 Log::info(),或统一配置 schedule:run 输出到日志文件(修改 cron 行末尾)避免踩坑的关键点:
APP_ENV 和 APP_DEBUG 在生产 cron 环境中与预期一致(cron 默认不加载用户 shell 配置,可能缺少 PATH 或环境变量)withoutOverlapping() 防止前次任务未结束时被再次触发基本上就这些。Laravel 的任务调度不是黑盒,本质是“一个 cron + 一个调度器”,配置简单但细节决定成败。