laravel调度器本身不依赖任务驱动,它与队列机制独立;调度器决定任务何时执行,而队列驱动(如redis、database)决定任务是否异步执行,需在.env、queue:work及调度定义中协同配置才能使任务入队。

Laravel 任务调度本身不依赖“任务驱动”——它和队列(queue)是两个独立机制。调度器(Scheduler)负责何时触发任务,而队列驱动(如 database、redis)决定任务如何异步执行。你不需要为调度器配置驱动,但若调度的任务需要进队列异步运行,就得确保队列驱动已正确配置。
调度器不需要驱动,但任务可以走队列
默认情况下,Laravel 调度器直接同步执行 Artisan 命令或闭包。比如:
-
$schedule->command('backup:run')->dailyAt('02:00');—— 到点就同步运行命令 -
$schedule->call(...)->hourly();—— 直接执行 PHP 代码
如果你希望这些任务不阻塞调度进程、而是推入队列后台处理,只需在定义时加上 onQueue() 或让命令本身实现 ShouldQueue 接口。
让调度任务走队列的关键配置
要让调度触发的任务真正进入队列,需同时满足以下三点:
- 在
.env中设置QUEUE_CONNECTION=redis(或database等有效驱动) - 确保队列服务已启动:
php artisan queue:work redis(注意必须指定连接名) - 在调度定义中显式指定队列,例如:
$schedule->command('emails:send')->daily()->onQueue('emails');
或让命令类实现ShouldQueue,这样即使不写onQueue()也会自动进默认队列
常见误区:别混淆 schedule 和 queue 的配置点
很多人误以为要在 config/schedule.php 配置驱动——其实 Laravel 没有这个文件。调度相关配置只在两处:
-
系统 crontab:必须有一条每分钟执行
php artisan schedule:run的条目 -
app/Console/Kernel.php:所有任务定义都在schedule()方法里
队列驱动则完全由 config/queue.php 和 .env 控制,与调度器本身无关。
推荐组合:调度 + 队列的典型用法
适合耗时、可延迟、需失败重试的任务,例如:
- 每天 9 点发送汇总邮件:
$schedule->command('reports:send')->dailyAt('09:00')->onQueue('emails'); - 每 10 分钟检查第三方 API 状态,并异步处理响应:
$schedule->command('api:check')->everyTenMinutes()->onQueue('api'); - 避免闭包被序列化问题:把逻辑封装成 Artisan 命令,再让该命令实现
ShouldQueue











