J'utilise cURL dans mon application PHP pour me connecter à une API RESTful. Cependant, j'ai récemment découvert que je ne suis pas en train de paralléliser mes connexions cURL et que l'exécution de plusieurs connexions successives entraîne une latence extrême pour l'utilisateur final.Comment refactoriser ce script cURL pour tirer parti de la fonction curl_multi de PHP?
Je n'ai pas utilisé curl_multi
avant et je suis un peu à perte après avoir lu la documentation. Comment puis-je refactoriser le code suivant pour profiter de la parallélisation de curl_multi
?
EDIT: J'ai oublié de mentionner que j'ai ouvert l'API qui est utilisée ici. Ce sont mes propres Directed Edge PHP bindings. Donc, si vous le souhaitez, vous pouvez également avoir votre aide ici fusionnée dans le code sur GitHub et vous serez listé comme un contributeur.
Voici un exemple de ce que je fais dans le code client:
// 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);
Et voici les fonctions pertinentes de 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' est une interface bizarre, ou mon code est? –
curl_multi est bizarre, pas votre code. –
Rgr. J'ai vu votre montage un peu trop tard. –