You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 02:54:07