laravel任务调度本质是用php代码集中管理定时任务,依赖一条系统cron每分钟触发schedule:run命令,解析kernel.php中定义的任务并按时间执行。

Laravel 12 的任务调度本质是“用 PHP 写定时逻辑,靠一条系统 Cron 触发”,不需要你去服务器上配一堆 crontab 条目,所有任务统一在代码里管理,清晰又易维护。
第一步:只配一条服务器 Cron
这是整个调度系统的启动开关。登录你的服务器,运行:
* * * * * cd /your/project/path && php artisan schedule:run >> /dev/null 2>&1
注意替换 /your/project/path 为实际项目根目录。这条命令每分钟执行一次 Laravel 自带的调度器,它会自动检查 app/Console/Kernel.php 里定义的任务是否到了该跑的时间。
第二步:在 Kernel.php 里写任务
打开 app/Console/Kernel.php,找到 schedule() 方法。这里就是你的“任务控制台”:
- 执行 Artisan 命令:
$schedule->command('backup:database')->dailyAt('03:00'); - 执行闭包逻辑:
$schedule->call(function () { Cache::flush(); })->hourly(); - 运行系统脚本:
$schedule->exec('/usr/bin/php /path/to/script.php')->everyTenMinutes();
所有频率方法都支持链式调用,比如 ->weekly()->mondays()->at('09:00') 表示每周一上午 9 点执行。
第三步:加点实用小技巧
刚起步时容易忽略但很关键的细节:
-
日志记录:加
->output(storage_path('logs/schedule-backup.log'))把输出存下来,出问题马上查 -
避免重复执行:集群环境加
->withoutOverlapping(),防止同一任务被多个服务器实例同时触发 -
限定环境:用
->environments(['production'])确保测试环境不会误跑清理任务 -
自定义时区:加
->timezone('Asia/Shanghai')避免服务器默认 UTC 时间导致任务时间错乱
第四步:本地验证和调试
不用等凌晨,立刻验证是否写对了:
- 运行
php artisan schedule:list查看所有注册任务及下次执行时间 - 手动触发某次调度:
php artisan schedule:run --verbose,带详细输出便于排查 - 临时改成每分钟跑一次测试逻辑,确认命令或闭包本身没问题后再调回正式频率
不复杂但容易忽略。把这四步走稳,Laravel 12 的任务调度就真正为你所用了。











