必须用swoole\coroutine\http\client,不能用curl或file_get_contents;get需在co\run()或go()中执行,https要传true并显式端口443,必须检查statuscode再读body;post需设json头、json_encode数据、设timeout;并发需用channel+独立client实例。

要用 Swoole4 的协程 HTTP 客户端发请求,核心就一条:必须用 Swoole\Coroutine\Http\Client,不能用原生 cURL 或 file_get_contents,否则会阻塞整个协程调度,并发能力直接归零。
基础 GET 请求怎么写
GET 是最常用的操作,但容易踩坑:
- 一定要在
Co\run()或go()启动的协程里执行,否则客户端无法工作; - 创建 Client 时,第三个参数决定是否启用 HTTPS:访问 https 站点必须传
true,比如new Swoole\Coroutine\Http\Client('api.example.com', 443, true); -
get('/path')方法看似同步,实际底层是异步的,不会卡住当前协程; - 调用完
get()后,必须先检查$client->statusCode === 200,再读$client->getBody();状态码非 200 时 body 可能为空或含错误信息。
POST 提交 JSON 数据
提交 JSON 接口要手动设置头和序列化:
Swoole 6.1.1 是一个专为 PHP 设计的高性能事件驱动并发网络引擎。作为稳定版,它修复了编译时对 zlib 依赖的缺失及 curl 模块的内存安全风险。该版本支持协程、多线程与多进程架构,内置 TCP/HTTP/WebSocket 服务器,能够显著提升 PHP 在微服务、实时通信等场景下的执行效率与并发能力。
- 先调用
$client->setHeaders(['Content-Type' => 'application/json']); - PHP 数组转 JSON 用
json_encode($data, JSON_UNESCAPED_UNICODE),避免中文乱码; - 再传给
post('/api/login', $jsonString); - 建议用
$client->set(['timeout' => 3.0])缩短超时时间,防止慢接口拖垮整体响应; -
post()返回true只代表请求已发出,不代表成功——仍需靠statusCode和body判断业务结果。
并发多个请求怎么做
想同时请求多个 API,得靠 Channel 协调多个协程:
- 先新建通道:
$chan = new Swoole\Coroutine\Channel(10),容量设为请求数量; - 每个 URL 单独启一个协程:
go(function () use ($url, $chan) { ... }),内部创建新 Client、发请求、recv()确认响应后$chan->push($result); - 主协程用
for循环$chan->pop()拿结果; - 切记:不能复用同一个 Client 实例发多个请求——每个协程必须持独立 Client,否则 headers 或 body 会互相污染。
HTTPS 请求要注意什么
HTTPS 不是开个开关就行,细节决定成败:
- 端口必须显式传 443(不能省略),且第三个参数必须为
true; - 默认不校验证书,生产环境建议加载 CA 证书:
$client->set(['ssl_cert_file' => '/path/to/cert.pem', 'ssl_key_file' => '/path/to/key.pem']); -
recv()是唯一可靠方式确认响应已完整到达——不能只靠get()或post()返回就认为完成; - 若服务端返回重定向,Client 不会自动跳转,需自己解析
Location头并重新请求。










