我在我的PHP应用程序中使用cURL来连接到RESTful API。不过,我最近才发现,我并没有对cURL连接进行并行化处理,因此对最终用户执行几次连续的连接导致极度延迟。如何重构此cURL脚本以利用PHP的curl_multi函数?
我以前没有使用过curl_multi
,在阅读文档后我感到很茫然。如何最好地重构以下代码以利用curl_multi
的并行化?
编辑:我忘了提到我开源了这里使用的API。这些是我自己的Directed Edge PHP bindings。所以如果你愿意,你也可以在这里把你的帮助合并到GitHub上的代码中,你将被列为贡献者。
下面是我在做什么客户端代码的例子:
// Get 100 goal recommendations from Directed Edge
$de = new DirectedEdgeRest();
$item = "user".$uid;
$limit = 100;
$tags = "goal";
$recommendedGoals = $de->getRecommended($item, $tags, $limit);
// Get 100 interest recommendations from Directed Edge
$de = new DirectedEdgeRest();
$item = "user".$uid;
$limit = 100;
$tags = "interest";
$recommendedInterests = $de->getRecommended($item, $tags, $limit);
而且这里距离DirectedEdgeRest()
/**
* Returns array of recommended result IDs for an item
* @param string $item Item, e.g. "Miles%20Davis"
* @param string $tags Tags as comma delimited string, e.g. "product,page"
* @param int $limit Limit for max results
*
* @return array Recommended result IDs
*/
public function getRecommended($item, $tags, $limit)
{
// Connect to Directed Edge and parse the returned XML
$targeturl = self::buildURL($item, 'recommended', $tags, $limit, 'true');
$response = self::getCurlResponse($targeturl);
$xml = self::parseXML($response);
// Iterate through the XML and place IDs into an array
foreach($xml->item->recommended as $recommended) {
$recommendedResults[] = filter_var($recommended, FILTER_SANITIZE_NUMBER_INT);
}
return $recommendedResults;
}
/**
* Builds URL for cURL
* @param string $item Item, e.g. "Miles%20Davis"
* @param string $type Type of API request: either "related" or "recommended"
* @param string $tags Tags as comma delimited string, e.g. "product,page"
* @param int $limit Limit for max results
* @param string $exclude "true" if you want to exclude linked, "false" otherwise
*
* @return string The target URL
*/
private function buildURL($item, $type, $tags, $limit, $exclude)
{
$targeturl = DE_BASE_URL;
$targeturl .= $item; // Item
$targeturl .= "/" . $type; // Type
$targeturl .= "?tags=" . $tags; // Tags
$targeturl .= "&maxresults=" . $limit; // Limit
$targeturl .= "&excludeLinked=" . $exclude; // Exclude
return $targeturl;
}
/**
* Returns the cURL response given a target URL
* @param string $targeturl The target URL for cURL
*
* @return string cURL Response
*/
private function getCurlResponse($targeturl)
{
$ch = curl_init($targeturl);
curl_setopt($ch, CURLOPT_POST, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
$response = curl_exec($ch);
curl_close($ch);
return $response;
}
'curl_multi'是一个奇怪的界面,或者我的代码是? – 2010-11-22 06:09:25
curl_multi是离奇的,而不是你的代码。 – 2010-11-22 06:21:00
Rgr。我看到你的编辑有点太晚了。 – 2010-11-22 06:34:46