Workerman 5.2.3 的 http-client 是基于 PHP 8.1+ Fiber 和 Revolt 的真正协程化异步 HTTP 客户端,需满足版本、扩展及加载要求;必须在 onMessage 中每次新建实例以复用全局连接池,支持 await、PSR-7 兼容操作与灵活配置。

Workerman 5.2.3 的 workerman/http-client 是一个真正协程化的异步 HTTP 客户端,不是“伪异步”,它依赖 PHP 8.1+ 的 Fiber 和 Revolt 事件循环,能原生非阻塞发请求、复用连接池、支持 await 写法。
确认运行环境是否就绪
缺一不可,否则会报 Fiber not running 或 Call to undefined function Revolt\{}:
- Workerman 版本 ≥ 5.0.0(5.2.3 已满足)
- http-client 版本 ≥ 2.0.0(执行
composer show workerman/http-client确认) - 已安装
revolt/event-loop ^1.0(composer require revolt/event-loop) - PHP 版本为 8.1 或更高(Fiber 必须启用,JIT 开关不影响)
- 启动脚本顶部已引入自动加载:
require_once __DIR__ . '/vendor/autoload.php';
在 onMessage 中正确创建并使用 Client
Client 实例轻量,但其底层连接池是全局共享的。不能声明为全局变量或静态属性,也不能复用跨请求的实例——必须在每次 onMessage 回调内新建:
- ✅ 正确:每次请求 new 一次,内部自动复用连接池
- ❌ 错误:在
onWorkerStart中 new 并存为变量,或用 static 缓存 - ⚠️ 注意:同一个 $client 可连续 await 多个请求(如串行调用多个 API),连接池会自动复用
示例:
(以下代码可直接用于 Workerman 5.2.3)$client = new Workerman\Http\Client();<br>try {<br> $resp = await $client->get('https://api.example.com/user/123');<br> $body = await $resp->getBody();<br> $data = json_decode($body, true);<br> $connection->send(json_encode(['user' => $data]));<br>} catch (Exception $e) {<br> $connection->send(json_encode(['error' => $e->getMessage()]));<br>}
支持的请求方式与常见用法
除基础 GET/POST,还支持完整 PSR-7 兼容操作:
-
await $client->get($url, $options):带 query、headers、timeout 等配置 -
await $client->post($url, $data, $options):自动识别 array → x-www-form-urlencoded,或传Psr\Http\Message\StreamInterface -
await $client->request($method, $url, $options):自定义 method、headers、body、version 等 - 上传文件:配合
Workerman\Psr7\MultipartStream构造 multipart body - 流式响应:用
$resp->getBody()->read(1024)分块读取大响应
关键配置项建议
所有选项都通过第三个参数传入(数组格式),不设则走默认值:
-
timeout:整个请求超时(秒,默认 30) -
connect_timeout:建连超时(秒,默认 5) -
max_connections:单域名最大空闲连接数(默认 10,高并发可调至 30–50) -
headers:设置 User-Agent、Authorization、Content-Type 等 -
verify_peer:false 可跳过 HTTPS 证书校验(仅测试环境)
示例带配置的 POST:
$resp = await $client->post('https://api.example.com/log',<br> ['event' => 'login', 'uid' => 999],<br> [<br> 'timeout' => 10,<br> 'headers' => ['Authorization' => 'Bearer abc123'],<br> ]);

















