laravel 10任务调度默认同步执行,无需队列驱动;若需异步处理,须用onqueue()或onconnection()将任务推入队列,并确保队列驱动已配置且worker正在运行。

Laravel 10 的任务调度本身不依赖队列驱动,它和队列(Queue)是两个独立但可协同的系统。调度器(Scheduler)负责“什么时候执行”,而队列驱动(如 database、redis)决定“任务以什么方式异步执行”。所以严格来说,任务调度不需要设置“任务驱动”——它默认直接同步运行 Artisan 命令或闭包。
但如果你希望调度的任务不立即执行,而是推送到队列异步处理(比如避免阻塞调度进程、支持重试、解耦耗时操作),那就需要将调度任务“投递到队列”,这时才涉及队列驱动配置。
以下是关键要点:
调度任务默认是同步执行的
例如:
$schedule->command('emails:send')->daily();
这会在每天触发时,直接调用 handle() 方法,全程在 schedule:run 进程中同步完成。
如何让调度任务走队列(即“异步化”)
只需在定义调度任务时加上 onQueue('your-queue-name') 或 onConnection('redis'):
$schedule->command('reports:generate')
->dailyAt('03:00')
->onQueue('high'); // 推送到名为 'high' 的队列
或指定连接:
$schedule->call(function () {
\App\Jobs\SyncOrders::dispatch();
})->everyFiveMinutes()->onConnection('redis');
⚠️ 注意:
- 此时要求你已正确配置好队列驱动(如
QUEUE_CONNECTION=redis或database),并确保config/queue.php中对应连接可用; - 队列 Worker 必须正在运行(如
php artisan queue:work或 Supervisor 托管),否则任务会积压在队列中不执行; - 不要混淆
schedule:run(每分钟唤醒调度器)和queue:work(持续消费队列)——它们是两个不同进程。
常见搭配建议
- 轻量任务(如日志清理、缓存刷新):保持同步执行,简单高效;
-
耗时/外部依赖任务(如邮件发送、文件导出、API 调用):用
onQueue()推送至队列,配合--tries=3和失败表处理异常; -
需精确控制并发或优先级:结合多队列(
default、emails、exports)与--queue=emails启动 worker。
验证是否生效
- 查看数据库
jobs表(若用database驱动)是否有新记录; - 查看 Redis 中
queues:high列表长度(若用redis); - 检查
storage/logs/laravel.log是否有Dispatching job...日志。
不复杂但容易忽略。











