<p>Laravel 11 支持通过 ->cron() 方法在 schedule() 中直接使用标准五字段 Cron 表达式定义任务周期,如 '15 3 *' 表示每天凌晨 3:15 执行;表达式不兼容链式频率方法,需注意时区对齐与服务器 Cron 配合。</p>

Laravel 11 的任务调度支持直接使用 Cron 表达式定义执行周期,这是最灵活的配置方式,适合需要精确到秒级、非标准间隔或跨多时区的场景。它不依赖预设的链式方法(如 ->daily()),而是通过 ->cron() 方法传入标准五字段表达式。
怎么在 schedule() 中用 Cron 表达式
在 app/Console/Kernel.php 的 schedule() 方法里,调用 $schedule->command() 或 $schedule->call() 后,接 ->cron('表达式') 即可:
-
每天凌晨 3:15 执行备份命令:
$schedule->command('backup:run')->cron('15 3 * * *'); -
每小时的第 45 分钟执行(即 00:45、01:45…):
$schedule->command('cache:prune')->cron('45 * * * *'); -
每周一、三、五上午 9 点整运行:
$schedule->command('sync:users')->cron('0 9 * * 1,3,5'); -
每月 1 日和 15 日凌晨 1 点:
$schedule->command('billing:process')->cron('0 1 1,15 * *');
Cron 表达式格式与注意事项
Laravel 使用标准 Unix Cron 格式(5 字段),顺序为:
分 时 日 月 周(注意:周日是 0 或 7,周一为 1)
- 支持常见符号:
*(任意值)、,(列举)、-(范围)、/(步长),例如'*/10 * * * *'表示每 10 分钟一次 - 表达式中不能含注释或空行,必须是纯字符串
- 服务器系统 Cron 和 Laravel 的
schedule:run都需正常运行——Laravel 只负责“解析”,真正触发靠系统 Cron 每分钟拉起 - 若本地开发测试,可用
php artisan schedule:run --verbose查看当前是否匹配表达式
和链式方法混用?不推荐
->cron() 是独立设定,不能再叠加 ->daily()、->at() 等频率方法,否则会报错或被忽略。如果需要条件控制,应改用 ->when() 或 ->environments():
- 只在生产环境运行:
$schedule->command('send:alerts')->cron('0 * * * *')->environments(['production']); - 满足自定义逻辑才执行:
$schedule->command('cleanup:old')->cron('0 2 * * *')->when(fn() => config('app.clean_enabled'));
时区要对齐
Cron 表达式默认按服务器本地时区解析。Laravel 会读取 config/app.php 中的 'timezone' 设置,但 ->cron() 不自动转换——建议统一用 UTC 写表达式,或显式指定任务时区:
- 强制按上海时间执行:
$schedule->command('report:daily')->cron('0 9 * * *')->timezone('Asia/Shanghai'); - 修改后记得清缓存:
php artisan config:clear


















