我正在使用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数量
我会说异步性也存在问题,因为我需要花费的时间越长,我就越有可能达到...