要在swoole中发起不阻塞主线程的http请求,需启用协程:先确保swoole≥4.4.0并启用扩展,再调用swoole\runtime::enablecoroutine(),然后用co\http\client在协程中异步发送get/post请求,并通过waitgroup或channel协调并发,设置timeout但需手动实现重试。

要在Swoole中发起不阻塞主线程的HTTP请求,比如向第三方API批量拉取数据、触发通知或轮询状态,必须绕过PHP传统的curl同步模型,启用协程调度机制。
启用协程环境
第一步:确保Swoole版本 ≥ 4.4.0,且PHP已启用Swoole扩展;若未安装,请先执行pecl install swoole并确认extension=swoole.so已写入php.ini。
第二步:在脚本开头调用Swoole\Runtime::enableCoroutine()——这一步【必须在任何协程操作之前执行】,否则后续的Co\Http\Client将退化为同步行为,请求会卡住整个进程。
第三步:启动一个协程,用Swoole\Coroutine::create(function () { ... })包裹你的HTTP请求逻辑;直接在主流程里调用客户端不会自动协程化。
发起基础GET请求
创建客户端实例:$client = new Swoole\Coroutine\Http\Client('httpbin.org', 80);——注意这里不能传入完整URL,只填域名和端口;若目标是HTTPS,端口应为443,且需额外设置$client->set(['ssl' => true])。
发送请求:$client->get('/get?foo=bar');——该方法立即返回,不等待响应,真正挂起发生在底层I/O等待时。
读取响应:if ($client->statusCode === 200) { echo $client->body; }——statusCode和body字段仅在get()(或post())返回后才可用,不可提前访问。
并发多个请求
方法一:用go函数逐个启动协程
Swoole 6.1.1 是一个专为 PHP 设计的高性能事件驱动并发网络引擎。作为稳定版,它修复了编译时对 zlib 依赖的缺失及 curl 模块的内存安全风险。该版本支持协程、多线程与多进程架构,内置 TCP/HTTP/WebSocket 服务器,能够显著提升 PHP 在微服务、实时通信等场景下的执行效率与并发能力。
go(function () use ($url) { $cli = new Co\Http\Client(...); $cli->get($url); echo $cli->body; });——每个go调用都开辟独立协程栈,互不干扰;但需自行管理结果收集,比如用引用数组或Channel。
方法二:用Co\WaitGroup统一协调
先$wg = new Co\WaitGroup;,每次go前调用$wg->add(),协程末尾调用$wg->done(),最后$wg->wait()阻塞直到全部完成——这比sleep(1)可靠得多,避免因响应时间波动导致漏等。
方法三:用Co\Channel传递结果
创建容量足够的通道$chan = new Co\Channel(10),每个协程处理完把结果$chan->push(['url' => $url, 'body' => $client->body]),主线程循环$chan->pop()接收;【通道容量必须≥并发请求数,否则协程会永久阻塞在push】。
设置超时与重试
在new Co\Http\Client()后立即调用$client->set(['timeout' => 5.0]),单位为秒;这个值同时控制连接、写入和读取超时,不能单独设置某一项。
手动重试需自行编码:对$client->get()结果判断!$client->connected或$client->errCode !== 0,在循环内重新实例化客户端并重发——旧客户端对象不可复用,重复调用get()会报错。
不要依赖set里的retry选项,Swoole原生HTTP客户端不支持自动重试配置。










