当并行发送1k +请求时,cURL multi会给出错误的结果

时间:2016-06-26 20:56:22

标签: php curl

我需要同时制作超过1k rqs并在不到1分钟的时间内获得响应。我使用PHP和cURL multi。出于某种原因,cURL没有按预期工作,也无法处理如此多的请求。

我正在使用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();

我将超时设置为10秒。

当我打开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并只设置一个网址(即domain1.com)时,它运行良好,并提供正确的状态200 ...

我达到了一定的限度吗?我能用它做什么吗?

1 个答案:

答案 0 :(得分:1)

  

我达到了一定的限度吗?我能用它做什么吗?

好吧,你可以查看netstat你没有达到最大值。套接字。

请注意您使用的图书馆已有4年历史并已弃用。 所以,我想,这不是你的错,请求不会同时运行。根据问题跟踪器,其他开发人员遇到与此库相同的问题,请参阅https://github.com/petewarden/ParallelCurl/issues/20。 RollingCurlX(https://github.com/marcushat/rollingcurlx)的创建是为了解决这个问题。

我建议选择Guzzle(https://github.com/guzzle/guzzle)。 这里提供的GuzzleHttp \ Pool示例http://docs.guzzlephp.org/en/latest/quickstart.html#concurrent-requests 应该让你立刻开始...