hyperf 3.1 中高并发 http 请求应使用协程并行方案:先安装 hyperf/guzzle 和 hyperf/parallel,再通过 clientfactory 创建异步客户端,用 getasync() 发起请求,最后用 parallel::wait() 或 promise\all() 统一等待结果。

Hyperf 3.1 中需在高并发场景下同时发起多个 HTTP 请求并等待全部完成,但直接用 foreach 串行调用会严重拖慢响应时间,而误用 .NET 的 Parallel 类又会导致编译失败或运行时异常——因为 Parallel 是 C# 特有类型,PHP 环境根本不存在 System.Threading.Tasks 命名空间。
Hyperf 中真正可用的并行请求方案
第一步:确认项目已安装 hyperf/guzzle 组件。若未安装,执行 composer require hyperf/guzzle。
第二步:在控制器或服务中注入 Hyperf\Guzzle\ClientFactory 实例,这是协程安全的 HTTP 客户端工厂。
第三步:调用 $client->getAsync() 批量创建 Promise 对象,而非 get() —— 后者是同步阻塞调用,会彻底废掉协程并发能力。
第四步:用 Promise\settle() 或 Promise\all() 统一等待所有异步请求完成。推荐用 all(),它会在任一请求失败时立即抛出异常;若需容错,改用 settle() 并手动检查每个结果状态。
Parallel 类在 Hyperf 中根本不能用
方法一:直接写 Parallel::for() 或 new Parallel() → 编译报错 Class "Parallel" not found,因为 PHP 没有该类,Hyperf 也未提供同名封装。
方法二:尝试 use System\Threading\Tasks\Parallel → 解析失败,PHP 不支持反斜杠路径式命名空间映射,且 .NET 运行时完全缺失。
【关键前提】 Parallel 是 .NET Framework/.NET Core 的专有类型,仅存在于 C# 项目中。Hyperf 是 PHP 框架,底层依赖 Swoole 协程,二者运行时环境、线程模型、调度器完全隔离,强行混用会导致 fatal error。
Hyperf 3.1 推荐的协程并行写法
① 使用 go() 启动多个协程,各自发起请求并写入共享容器:
go(function () use ($client, $url, &$results) { $response = $client->get($url); $results[] = $response->getBody()->getContents(); });
② 用 Hyperf\Utils\WaitGroup 等待全部完成:
$wg = new WaitGroup(); $wg->add(3); go(function () use ($wg) { sleep(1); $wg->done(); }); $wg->wait();
③ 更简洁的方式:直接用 Parallel 组件(Hyperf 官方扩展)——注意这不是 .NET 的 Parallel,而是 hyperf/parallel 包提供的协程级并行工具:
执行 composer require hyperf/parallel → 在代码中 use Hyperf\Parallel\Parallel; → 创建实例 $p = new Parallel(); → 添加任务 $p->add(fn() => $client->get('https://api.example.com/1')); → 调用 $p->wait() 获取结果数组。
这一步必须确保 hyperf/parallel 已启用,否则 new Parallel() 会触发 Class not found 错误。











