因此,我在不同的网址上获得了算法的不同部分,以使其更快。我总共收到了4个卷曲请求,其中一个有时会失败。他们都返回了一些东西,最后它根据所有的回答给出了结果。
失败的那个有时会从外部站点API请求客户数据,并在获取时将其插入数据库。如果客户数据超过30天,则使用数据库数据,否则会请求更新的数据。如果没有数据或超过30天,则返回null。最多花费3秒钟时间
我创建了一个多卷曲类。在一开始它会定期卷曲,返回cookie并使用多卷曲 - 用于传递登录。最后,它返回数组中的所有响应。
这可能是什么问题?
使用多卷曲的文件:
$multiCurl = new MY_MULTICURL_CLASS();
$multiCurl->setRequestData($data);
$multiCurl->addRequestUrl('http://sampleurl.com/');
$multiCurl->addRequestUrl('http://sampleurl.com/');
$multiCurl->addRequestUrl('http://sampleurl.com/');
$multiCurl->addRequestUrl('http://sampleurl.com/');
$responses = $multiCurl->getData();
MY_MULTICURL_CLASS getData方法:
public function getData()
{
/* Getting login cookie */
$returnCookies = $this->loginCookies(null, true);
//create the multiple cURL handle
$mh = curl_multi_init();
// set curl resources and options
$k = 1;
foreach ($this->requestURLS as $url)
{
${"ch".$k} = curl_init();
curl_setopt(${"ch".$k}, CURLOPT_URL, $url);
curl_setopt(${"ch".$k}, CURLOPT_HEADER, 0);
curl_setopt(${"ch".$k}, CURLOPT_COOKIE, implode(';', $returnCookies));
curl_setopt(${"ch".$k}, CURLOPT_RETURNTRANSFER, true);
curl_setopt(${"ch".$k}, CURLOPT_CONNECTTIMEOUT ,0);
curl_setopt(${"ch".$k}, CURLOPT_TIMEOUT, 60);
curl_setopt(${"ch".$k}, CURLOPT_POSTFIELDS, http_build_query($this->requestData));
curl_multi_add_handle($mh, ${"ch".$k});
$k++;
}
$active = null;
//execute the handles
do
{
$mrc = curl_multi_exec($mh, $active);
}
while ($mrc == CURLM_CALL_MULTI_PERFORM);
while ($active && $mrc == CURLM_OK)
{
if (curl_multi_select($mh) != -1)
{
do
{
$mrc = curl_multi_exec($mh, $active);
}
while ($mrc == CURLM_CALL_MULTI_PERFORM);
}
}
for($i=1; $i <= count($this->requestURLS);$i++)
{
$content = curl_multi_getcontent(${"ch".$i});
$response[] = json_decode($content, true);
//close the handles
curl_multi_remove_handle($mh, ${"ch".$i});
}
curl_multi_close($mh);
return $response;
}