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 次
