CURL循环发送XML偶现443端口超时问题求助
解决CURL循环发送XML偶现连接超时问题
针对你遇到的循环发送XML请求时偶现端口443连接超时问题,给出以下具体解决建议:
添加请求重试机制
偶现超时大概率是网络波动导致,可在单次请求失败后自动重试(建议2-3次),重试前短暂休眠避免频繁请求:foreach($contents as $key=>$val){ // 构建XML数据部分不变 $maxRetries = 3; $retryCount = 0; $response = false; $err = ''; do { $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_URL => "https://example.com", CURLOPT_ENCODING => '', CURLOPT_MAXREDIRS => 10, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_RETURNTRANSFER => true, CURLOPT_CUSTOMREQUEST => "POST", CURLOPT_POSTFIELDS => $data, CURLOPT_SSL_VERIFYPEER => 0, CURLOPT_HTTPHEADER => array("Content-Type: text/xml","User-Agent: Mozilla/5.0"), CURLOPT_TIMEOUT => 60, CURLOPT_CONNECTTIMEOUT => 45, // 延长连接超时时间到45秒 CURLOPT_VERBOSE => true, CURLOPT_FAILONERROR => true, )); $response = curl_exec($curl); $err = curl_error($curl); curl_close($curl); $retryCount++; if ($err && $retryCount < $maxRetries) { usleep(1000000); // 重试前休眠1秒 } } while ($err && $retryCount < $maxRetries); // 后续日志记录逻辑不变 if($err){ $logs = '[ '.date('Y-m-d H:i:s',time()).'] [ error ] '.$err."\r\n"; $logfile = fopen('E:\xampp\htdocs\project\errors_test.log','a','1'); fwrite($logfile, $logs); fclose($logfile); } }指定DNS服务器解决解析问题
偶现连接超时可能是DNS解析不稳定,手动设置可靠的DNS服务器:// 在curl_setopt_array中添加 CURLOPT_DNS_SERVERS => '114.114.114.114,8.8.8.8',启用TCP保活与连接复用
开启TCP保活机制,同时允许复用连接,减少每次请求的握手开销:// 在curl_setopt_array中添加 CURLOPT_TCP_KEEPALIVE => true, CURLOPT_TCP_KEEPIDLE => 60, // 连接闲置60秒后发送保活包 CURLOPT_TCP_KEEPINTVL => 10, // 保活包发送间隔10秒 CURLOPT_FORBID_REUSE => false, // 允许复用连接 CURLOPT_FRESH_CONNECT => false, // 不强制新建连接降低请求频率
如果$contents数据量较大,频繁请求可能触发对方服务器限流,在每次请求后添加短暂延迟:// 在curl_close之后添加 usleep(500000); // 休眠0.5秒排查服务器端限制
若以上方法无效,建议联系example.com的服务提供商,确认是否存在并发连接数限制、防火墙临时拦截等情况。
内容的提问来源于stack exchange,提问作者anil
相关产品推荐
相关产品推荐

