laravel11-concurrency-defer

test12026-10-2623 次阅读

Concurrency:并行跑多个闭包

一个接口里要查三份独立报表,串行等三次太慢。Laravel 11 的 Concurrency facade 可以把多个闭包并行跑,返回结果按传入顺序收集,不用自己拼 Future 或队列。

use Illuminate\Support\Facades\Concurrency;
use App\Services\ReportService;

$results = Concurrency::run([
    fn () => (new ReportService)->daily(),
    fn () => (new ReportService)->weekly(),
    fn () => (new ReportService)->monthly(),
]);

[$daily, $weekly, $monthly] = $results;

Defer:响应之后再做

审计日志、发通知、刷缓存这类事不必阻塞用户。Defer 把闭包推迟到本次响应发出之后再执行,用户拿到结果更快,后台活儿照干。

use Illuminate\Support\Facades\Defer;

Defer::execute(fn () => (new \App\Services\Audit)->log('order.created', $orderId));

return response()->json(['ok' => true]);
// 响应先返回,审计落库在之后异步完成

一个组合场景

详情接口里用 Concurrency 并行取订单项与汇总,再用 Defer 记一次浏览量,主链路不掺任何慢操作。

use Illuminate\Support\Facades\Concurrency;
use Illuminate\Support\Facades\Defer;
use App\Models\Order;

public function show(Order $order)
{
    [$items, $summary] = Concurrency::run([
        fn () => $order->items()->with('product')->get(),
        fn () => $order->summary()->first(),
    ]);

    Defer::execute(fn () => $order->recordView(auth()->id()));

    return response()->json([
        'items'   => $items,
        'summary' => $summary,
    ]);
}

注意点

  • Concurrency 默认进程内并行,Laravel 11 也支持切到 Redis 等驱动做跨进程并行。
  • Defer 的闭包在请求结束、响应发出后执行,适合审计、通知、缓存刷新这类不必阻塞用户的事。
  • 两者都不该放强一致性要求的写操作;Defer 失败不影响主流程,记得加日志或重试兜底。
T

test1

文章作者

Concurrency:并行跑多个闭包 一个接口里要查三份独立报表,串行等三次太慢。Laravel 11 的 Conc...

分类
技术
发布时间
2026-10-26
字数
约 1402 字
阅读
23 次