Laravel 11 中的 defer() 方法如何在不碰任何队列的情况下,使我们的 API 响应速度提升至原来的三倍

发布日期:2026-03-29 10:04:50   浏览量 :1
发布日期:2026-03-29 10:04:50  
1

2026西湖龙井茶官网DTC发售:茶农直供,政府溯源防伪到农户家 

简而言之: Laravel 11 引入了 defer() 方法,它可以在 HTTP 响应发送给用户之后再执行代码。无需队列、无需任务类、无需工作进程。只需将你的“发完即忘”逻辑包裹在 defer() 中,你的 API 就会立刻变快。

去年我花了整整两天时间,试图弄清楚为什么我们的订单 API 接口需要 1.2 秒才能响应。实际上,订单本身大约只用了 80 毫秒就创建完成了。那么其余的时间都去哪儿了呢?

结果发现,我们在响应返回给用户之前,同步地发送了一封确认邮件、记录了一个分析事件、与第三方服务同步了库存,并清除了一个缓存键。

用户并不关心这些操作是否在看到订单确认页面之前完成。他们只想知道自己的订单已经成功提交了。

旧方法:凡事都用队列

通常的建议是把这些任务推送到队列中。你需要创建一个任务类、分发任务、运行队列工作进程、设置监控、处理失败的任务。对于具有复杂后台处理需求的大型应用来说,这样做是合理的。

但对于像发送邮件或记录事件这样简单的“发完即忘”任务呢?为这么简单的事情搭建一整套基础设施,未免有些小题大做。

我们的应用中有 14 个不同的任务类。其中 8 个都是只有一个方法的类,只做一件小事。每个类都有自己的文件、自己的测试,以及在失败任务表中的独立记录。这感觉太过度了。

defer() 登场

Laravel 11 新增了 defer() 方法,它彻底改变了我对后台任务的看法。它的使用方式如下:

Route::post('/order', function () {
    $order = Order::create($data);

    defer(fn() => Mail::send(new OrderConfirmation($order)));
    defer(fn() => Analytics::track('order_placed', $order));
    defer(fn() => InventorySync::push($order));
    defer(fn() => Cache::forget("user:{$order->user_id}:cart"));

    return response

免责声明:本文内容来自互联网,该文观点不代表本站观点。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请到页面底部单击反馈,一经查实,本站将立刻删除。

关于我们
热门推荐
合作伙伴
免责声明:本站部分资讯来源于网络,如有侵权请及时联系客服,我们将尽快处理
支持 反馈 订阅 数据
回到顶部