Guzzle调用外部API出现cURL error 18传输关闭存在未读数据问题
解决方案
禁用
Expect: 100-continue请求头
该头为cURL默认对较大请求自动添加的协商头,部分服务端对该头支持不完善会提前断开连接,可在请求配置中强制清空:// 单请求配置方式 'headers' => array_merge($this->getHeaders(), ['Expect' => '']) // 全局客户端配置方式,初始化Guzzle Client时添加 $client = new Client(['expect' => false]);添加cURL参数忽略内容长度校验
针对cURL error 18的典型场景,可强制忽略内容长度不匹配的错误,不影响正常数据读取:$response = $this->client->request( Request::METHOD_POST, $uri, [ 'body' => json_encode($body), 'headers' => $this->getHeaders(), 'timeout' => self::TIMEOUT, 'connect_timeout' => self::CONNECT_TIMEOUT, 'verify' => self::SSL_VERIFY, // 新增curl配置项 'curl' => [ CURLOPT_IGNORE_CONTENT_LENGTH => true, ], ] );移除手动配置的
Accept-Encoding头
Guzzle默认会自动处理gzip/deflate压缩响应的协商和解码,手动添加该头后会跳过自动解码逻辑,可能导致压缩数据解析异常触发连接提前断开,删除getDefaultHeaders方法中的'Accept-Encoding' => 'gzip, deflate'配置即可。禁用HTTP长连接
部分服务端对长连接的处理存在缺陷,可将请求头中的Connection值改为close,或者在Guzzle配置中添加'force_ip_resolve' => 'v4',避免IPv6解析异常导致的连接断开。
内容的提问来源于stack exchange,提问作者Karol Gasienica
相关产品推荐
相关产品推荐

