是否有一种干净的方法可以在PHP中一次超时多个卷曲?

时间:2017-03-01 09:06:56

标签: php curl

我正在使用curl_multi_init()来获取多个网址上的资源,但存在以下问题:

当他们无法连接到他们的网址时,我的卷发会正常超时(感谢CURLOPT_CONNECTTIMEOUT)

当请求耗时太长时,它们也会超时(CURLOPT_TIMEOUT)

但是当整个过程耗时太长时,我找不到告诉curl_multi超时的方法

   do {
        curl_multi_exec($mh, $active);
        curl_multi_select($mh, 1);
    } while ($active > 0);

curl_multi_select有一个超时参数,但它似乎没有帮助。

我的问题是:我是否必须自己处理一些代码,或者我是否错过了curl文档中的内容?

这是我的函数和initCurl

的开头
protected function getContents(array $urls, callable $formatter, array $headers = [], $maxRetry = 3)
{
    $curls = [];
    $mh = curl_multi_init();
    foreach ($urls as $url) {
        $curl = $this->initCurl($url, $headers);

        curl_multi_add_handle($mh, $curl);
        $curls[$url] = $curl;
    }

    $active = null;
    do { // this loop is taking too long, resulting in a 504 error from nginx
        curl_multi_select($mh, 1);
        curl_multi_exec($mh, $active);
    } while ($active > 0);

    ... (rest of the function)
}


protected function initCurl($url, array $headers = [])
{
    $curl = curl_init();

    curl_setopt_array(
        $curl,
        [
            CURLOPT_RETURNTRANSFER => 1,
            CURLOPT_URL            => $url,
            CURLOPT_HTTPHEADER     => $headers,
            CURLOPT_FOLLOWLOCATION => true,
            CURLOPT_VERBOSE        => false,
            CURLOPT_CONNECTTIMEOUT => 2,
            CURLOPT_TIMEOUT => 2
        ]
    );

    return $curl;
}

我必须获得的$ urls越多,整个过程花费的时间就越多:

(url timeout 2s * 3 retries)* urls数量

我会说异步性也存在问题,因为我需要花费的时间越长,我就越有可能达到...

0 个答案:

没有答案