Laravel 11任务调度与队列协同工作:调度器定义执行时间,队列系统(如Redis)负责异步执行;需配置QUEUE_CONNECTION、在Kernel中用->job()或->runInBackground()声明执行方式,并通过queue:work持续监听消费。

Laravel 11 的任务调度本身不直接“配置队列”,而是通过 schedule 方法定义定时任务,再由 Laravel 的队列系统(如 Redis、Database 等)异步执行这些任务。关键在于:调度器负责“什么时候跑”,队列负责“怎么跑”——两者需协同,但配置是分开的。
一、确认队列驱动已正确配置
调度任务若要异步执行(比如用 ->runInBackground() 或推送到队列),必须先选好并启用队列驱动:
-
编辑
.env文件:QUEUE_CONNECTION=redis # 或 database / sqs / beanstalkd(按实际环境选)
确保对应驱动依赖已安装(如 Redis 需
predis/predis或phpredis扩展)。
⚠️ 注意:
sync驱动是同步执行,任务不会进队列,仅用于本地调试,不能用于真实调度场景。
二、在 Kernel 中注册可调度的命令,并指定队列行为
Laravel 11 将调度逻辑统一收口到 App\Console\Kernel 类(需手动创建并绑定),其 schedule() 方法中可对命令显式声明队列执行方式:
protected function schedule(Schedule $schedule): void
{
// 方式1:直接运行 Artisan 命令(默认同步,除非加 runInBackground)
$schedule->command('backup:database')
->dailyAt('02:00')
->runInBackground(); // ← 这会启动新进程,不阻塞主调度器
// 方式2:投递到队列(推荐用于耗时/需重试的任务)
$schedule->job(new ProcessOrders)
->hourly()
->onQueue('high'); // ← 指定队列名
// 方式3:带超时和失败回调(Laravel 11 新增 API)
$schedule->job(new SendDailyReports)
->dailyAt('08:00')
->timeout(600) // 10 分钟超时
->onQueue('reports')
->onFailure(function ($failed) {
\Log::error('Daily report job failed', ['job' => $failed->job]);
});
}✅ 提示:
->runInBackground()是进程级并发,适合轻量、短时任务;->job()是队列级并发,支持失败重试、延迟、优先级等完整队列能力。
三、确保队列监听器持续运行
调度器只负责“下发任务”,真正消费队列的是 queue:work 进程:
-
启动常驻队列监听:
php artisan queue:work --queue=high,default --sleep=3 --max-jobs=100
生产环境建议用 Supervisor 管理该进程,防止崩溃退出。
? 特别注意:Laravel 11 默认不再自动生成
app/Console/Kernel.php,需手动创建并注册为单例(见知识库中withSingletons()绑定方式),否则schedule:run不会加载你的任务。
四、验证调度与队列是否联动
-
查看当前注册的所有调度任务:
php artisan schedule:list
-
手动触发调度(模拟 cron):
php artisan schedule:run
检查 Redis 或数据库
jobs表,确认任务是否成功入队;查看 Horizon(如已启用)或日志,确认任务是否被消费。
不复杂但容易忽略


















