Zebra_cURL并发请求达500次时出现CURLE_COULDN'T_CONNECT错误求助
解决Zebra_cURL并行请求大量URL时的连接超时/无法连接问题
我最近在用Zebra_cURL处理一批约2300个URL的并行请求,结果当请求量达到500次左右时,系统开始抛出CURLE_COULDN'T_CONNECT错误,查看详细错误信息后发现实际是CURLE_OPERATION_TIMEDOUT(错误码28)。我已经确认所有目标URL都能正常访问,尝试了论坛里的几种方案也没解决问题,最终通过调整Zebra_cURL的线程数和暂停间隔搞定了,分享一下我的经历:
初始代码
我最开始的实现代码完全按照Zebra_cURL文档规范编写:
$curl1 = new Zebra_cURL(); $curl1->cache('cache', 3600); $curl1->option(CURLOPT_CONNECTTIMEOUT, 20); $curl1->option(CURLOPT_FOLLOWLOCATION, 1); $curl1->ssl(true); $curl1->get($com_url_arr_glo, 'getsizemk');
其中$com_url_arr_glo是包含2300个目标URL的数组,getsizemk是处理每个请求结果的回调函数。
错误详情
返回的错误数组显示请求超时(total_time达到30秒),且没有获取到任何响应内容:
[info] => Array ( [original_url] => https://www.masterkreatif.com/page/12 [url] => https://www.masterkreatif.com/page/12 [content_type] => [http_code] => 0 [header_size] => 0 [request_size] => 162 [filetime] => -1 [ssl_verify_result] => 0 [redirect_count] => 0 [total_time] => 30.109 [namelookup_time] => 1.0E-6 [connect_time] => 0.406 [pretransfer_time] => 0.906 [size_upload] => 0 [size_download] => 0 [speed_download] => 0 [speed_upload] => 0 [download_content_length] => -1 [upload_content_length] => -1 [starttransfer_time] => 0 [redirect_time] => 0 [redirect_url] => [primary_ip] => 104.24.117.230 [certinfo] => Array ( ) [primary_port] => 443 [local_ip] => 192.168.43.56 [local_port] => 25775 ) [headers] => Array ( [last_request] => Array ( [0] => Array ( [Request Method] => GET /page/12 HTTP/1.1 [Host] => www.masterkreatif.com [User-Agent] => Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.0) [Accept] => */* [Accept-Encoding] => gzip,deflate ) ) [responses] => Array ( ) ) [body] => [response] => Array ( [0] => CURLE_OPERATION_TIMEDOUT [1] => 28 )
解决方案
我尝试给Zebra_cURL添加了线程数限制和请求间隔配置,每处理30个URL后暂停5秒,问题立刻得到解决。修改后的代码如下:
$curl1 = new Zebra_cURL(); $curl1->cache('cache', 3600); $curl1->option(CURLOPT_CONNECTTIMEOUT, 20); $curl1->option(CURLOPT_FOLLOWLOCATION, 1); $curl1->ssl(true); // 添加的关键配置 $curl1->pause_interval = 5; // 每批请求处理完成后暂停5秒 $curl1->threads = 30; // 每次并行处理30个请求 $curl1->get($com_url_arr_glo, 'getsizemk');
这个调整的核心逻辑是:
- 限制并行请求数,避免短时间内发送大量请求导致目标服务器触发限流机制,或者本地网络连接资源耗尽
- 每批请求后添加暂停时间,给目标服务器和本地网络留出缓冲恢复的时间
虽然我不确定这个配置是否适用于所有同类的连接超时/无法连接问题,但在我的场景中确实完美解决了问题。
内容的提问来源于stack exchange,提问作者The Bang Bandit
相关产品推荐
相关产品推荐

