Swoole协程HTTP客户端必须在协程中运行,否则connect()立即返回false;timeout仅在connect()和execute()参数中生效,读写超时需set(['timeout'=>x]);HTTP/2需显式启用并开启SSL;Cookie隔离靠实例独立,禁止复用client。
new Swoole\Coroutine\Http\Client() 为什么连不上?
协程客户端必须在协程环境中运行,直接 new 出来但没进协程,
会立刻返回
,且不报错——这是最常卡住的地方。
确认当前是否在协程内:用
检查,返回
或
就说明不在协程中
别在主进程或同步回调里初始化它,比如
(非协程模式)或
中直接 new
正确做法是:用
包裹,或在
里创建
timeout 参数传哪里才生效?
不是构造函数参数,也不是
的通用配置项,它只在
和
这两个调用点上起作用,而且语义不同。
的第三个参数是连接超时(单位秒),不是读写超时
的第三个参数是整个请求生命周期上限(含 DNS、connect、send、recv),但仅限 HTTP/1.1;HTTP/2 下该参数被忽略
真正控制读写超时要用
,但它只影响后续的
行为,对
无效
HTTP/2 客户端怎么开?
不是加个
就自动走 HTTP/2,Swoole 要求明确启用,并且服务端必须支持 ALPN。
Swoole 6.1.1
Swoole 6.1.1 是一个专为 PHP 设计的高性能事件驱动并发网络引擎。作为稳定版,它修复了编译时对 zlib 依赖的缺失及 curl 模块的内存安全风险。该版本支持协程、多线程与多进程架构,内置 TCP/HTTP/WebSocket 服务器,能够显著提升 PHP 在微服务、实时通信等场景下的执行效率与并发能力。
下载
构造时必须传
第四个参数:
,最后这个
表示启用 HTTP/2
必须开启 SSL(第三个参数为
),HTTP/2 over TCP 不被支持
如果
失败或
,说明协商失败,常见原因是服务端没配 ALPN 或用了自签名证书没加
并发请求时 Cookie 怎么隔离?
每个
实例自带独立 Cookie 上下文,但开发者常误以为“全局 Cookie 管理”存在,结果多个请求互相污染。
不需要手动调用
来传递;只要复用同一个实例,它的
和自动解析就自然生效
千万别在多个协程里共享一个 client 实例——它不是线程安全的,更不是协程安全的;每次
都该 new 一个新实例
如需跨请求带 Cookie,用
读取后手动塞到下一个 client 的
,但注意有效期和 domain 匹配逻辑得自己判
HTTP/2 的 stream 复用、协程调度时机、SSL 握手缓存这些底层行为,会让超时和重试逻辑比看起来复杂得多。别依赖默认值,每个 timeout 都得按实际链路环节单独设。
connect()falseSwoole\Coroutine::getuid()falsenullonReceive__constructSwoole\Coroutine\run()go(function () { ... })timeoutset()connect()execute()connect('127.0.0.1', 80, 3.0)execute('/api', 'POST', $data)set(['timeout' => 5.0])recv()connect()ssltruenew Swoole\Coroutine\Http\Client('httpbin.org', 443, true, true)truetrueupgrade()$client->getProtocol() === 1set(['ssl_cert_file' => ...])Swoole\Coroutine\Http\ClientsetCookie()setCookie()go$client->cookiessetCookie()