在发送1K 请求并行时,curl multi给出错误的结果



我需要同时进行超过1k的RQ,并及时获得响应少于1分钟。我正在使用PHP和Curl Multi。由于某种原因,卷发无法正常工作,无法处理此类请求。

我正在使用https://github.com/petewarden/parallelcurl

$parallel_curl = new ParallelCurl(1000, [
    CURLOPT_SSL_VERIFYPEER => FALSE,
    CURLOPT_TIMEOUT => 10,
    CURLOPT_SSL_VERIFYHOST => FALSE,
    CURLOPT_HTTPHEADER => [
        'Accept-Encoding: gzip',
        'Accept: */*'
    ]
]);
$resp = function($content, $url, $ch, $search) {
    $info = curl_getinfo($ch);
    file_put_contents("result.csv", $info['url'] . ";" . $info['total_time'] . ";" . $info['http_code'] . "n", FILE_APPEND);
};
$urls = explode("n", file_get_contents("urls.csv"));
foreach(array_slice($urls, 0, 1000) as $url) {
    $parallel_curl->startRequest("http://" . $url, $resp);
}

$parallel_curl->finishAllRequests();

我将超时设置为10s。

当我打开result.csv并按total_time降序排序时,大约一半的条目就像

domain;total_time;http_code
http://domain1.com;0.000785;0
http://domain2.com;0.000783;0
http://domain3.com;0.00077;0
http://domain4.com;0.000761;0
http://domain5.com;0.00076;0

curl给出了状态代码0,响应时间很短,尽管域存在并在浏览器中正常加载。当我编辑urls.csv并仅设置一个URL(即domain1.com)时,它运行良好并给出正确的状态200 ...

我要达到一定的限制吗?我可以做什么吗?

我要达到一定的限制吗?我可以做什么吗?

好吧,您可以向netstat核实您没有达到最大值。插座。

请考虑您使用的图书馆已有4年的历史和弃用。因此,我想,这些请求没有同时运行,这不是您的错。根据问题跟踪器,其他开发人员在此库中遇到了同样的问题,请参见https://github.com/petewarden/parallelcurl/issues/20。创建了RollingCurlx(https://github.com/marcushat/rollingcurlx)来解决该问题。

我建议与guzzle(https://github.com/guzzle/guzzle)一起使用。http://docs.guzzlephp.org/en/latest/quickstart.html#concurrent-requests提供的guzzlehttp pool示例应该立即让您开始...

最新更新