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

在 Laravel 中配置任务调度,核心是通过内置的 Scheduler 统一管理定时任务,并借助服务器的 cron 每分钟触发一次 Laravel 的调度命令。不需要为每个任务单独写系统 cron 条目。
1. 在 app/Console/Kernel.php 中定义调度任务
所有定时任务都在 app/Console/Kernel.php 的 schedule() 方法中注册。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_ENV和APP_DEBUG在生产 cron 环境中与预期一致(cron 默认不加载用户 shell 配置,可能缺少 PATH 或环境变量) - 避免重复执行:使用
withoutOverlapping()防止前次任务未结束时被再次触发 - 多服务器部署:若应用部署在多台机器,需确保只有其中一台运行调度(可用缓存锁或数据库锁控制)
- 权限问题:确保 web 用户和 cron 运行用户对 storage/logs、storage/framework/cache 等目录有读写权限
基本上就这些。Laravel 的任务调度不是黑盒,本质是“一个 cron + 一个调度器”,配置简单但细节决定成败。










