PHP cURL请求出现SSL_write()错误(错误码55)求助
解决cURL SSL_write()错误(Error 55: bad write retry)
这个错误(error:1409F07F:SSL routines:ssl3_write_pending:bad write retry)对应cURL错误码55,本质是SSL连接写入阶段,curl尝试重写未完成的SSL数据时触发的异常,多和网络波动、连接复用状态异常或特定版本的cURL/OpenSSL兼容问题有关。结合你的环境(生产Linux服务器偶现,本地正常),可以尝试以下解决方案:
1. 禁用连接复用
生产环境中,连接复用可能导致旧连接处于异常状态,强制每次请求新建连接可以规避这个问题:
在curl选项数组中添加:
CURLOPT_FORBID_REUSE => true,
2. 调整SSL写入相关选项
OpenSSL 1.1.1p的某些场景下,空片段插入可能触发写入重试错误,通过SSL选项禁用该行为:
CURLOPT_SSL_OPTIONS => SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS,
如果PHP环境不识别SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS常量,直接用其数值0x00000800替代。
3. 优化网络超时与连接保活
生产网络波动可能导致写入超时,增加连接超时配置并启用TCP保活维持连接活性:
CURLOPT_CONNECTTIMEOUT => 10, // 连接超时时间(秒) CURLOPT_TCP_KEEPALIVE => true, CURLOPT_TCP_KEEPIDLE => 60, // 空闲60秒后开始发送保活包 CURLOPT_TCP_KEEPINTVL => 10, // 每10秒发送一次保活包
4. 升级或降级cURL/OpenSSL版本
curl 7.84.0与OpenSSL 1.1.1p的组合存在已知的兼容性问题,尝试:
- 升级curl到7.85.0及以上版本
- 升级OpenSSL到1.1.1q及以上版本
- 或降级到更稳定的旧版本(如curl 7.83.0)
5. 检查目标服务器SSL配置
用OpenSSL命令测试目标服务器的TLSv1.2兼容性:
openssl s_client -connect example.com:443 -tls1_2
确认服务器支持TLSv1.2,且没有会话复用限制或过载导致的连接异常。
修改后的完整示例代码
$url = 'https://example.com/services/service-name'; $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_URL => $url, CURLOPT_POST => true, CURLOPT_POSTFIELDS => $postData, CURLOPT_TIMEOUT => 30, CURLOPT_CONNECTTIMEOUT => 10, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_HTTPHEADER => $headers, CURLOPT_SSL_VERIFYPEER => true, CURLOPT_RETURNTRANSFER => true, CURLOPT_SSLVERSION => CURL_SSLVERSION_TLSv1_2, CURLOPT_VERBOSE => true, CURLOPT_STDERR => $fp, CURLOPT_FORBID_REUSE => true, CURLOPT_TCP_KEEPALIVE => true, CURLOPT_TCP_KEEPIDLE => 60, CURLOPT_TCP_KEEPINTVL => 10, CURLOPT_SSL_OPTIONS => SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS, )); $response = curl_exec($curl); // 可选:添加错误重试逻辑 if(curl_errno($curl) === 55){ // 重试1次 curl_close($curl); $curl = curl_init(); curl_setopt_array($curl, /* 重复上述选项 */); $response = curl_exec($curl); } curl_close($curl);
内容的提问来源于stack exchange,提问作者Alan
相关产品推荐
相关产品推荐

