Curl est un outil très puissant en PHP lors de la fabrication de plusieurs demandes HTTP asynchrones. En utilisant la fonction Curl_Multi_ * , les développeurs peuvent lancer plusieurs demandes en même temps pour améliorer l'efficacité. La fonction CURL_MULTI_CLOSE est utilisée pour fermer plusieurs sessions Curl, mais comment assurez-vous l'ordre des réponses lorsque vous faites des demandes asynchrones? Parce que Curl_Multi_EXEC peut renvoyer des réponses pour plusieurs demandes, et l'ordre dans lequel ces réponses peuvent être achevées peuvent être différentes de l'ordre dans lequel elles sont demandées.
Cet article expliquera en détail comment s'assurer que les résultats des demandes asynchrones conservent l'ordre des demandes lors de l'utilisation de curl_multi_close .
La série de fonctions Curl_Multi_ * fournit un moyen d'améliorer les performances grâce à des demandes simultanées. Plusieurs fonctions couramment utilisées comprennent:
curl_multi_init () : initialisez une poignée de curl et créez un pool de ressources Curl.
curl_multi_add_handle () : ajoute une poignée de curl au pool de requête Curl multiple.
curl_multi_exec () : exécute plusieurs requêtes Curl.
curl_multi_getContent () : Obtenez le contenu de la réponse de chaque demande.
curl_multi_close () : fermez le pool de requête Curl et relâchez les ressources.
Ces fonctions sont souvent utilisées ensemble pour effectuer des demandes asynchrones, améliorant ainsi les performances. Cependant, comme l'ordre d'achèvement des réponses peut être différent de l'ordre des demandes, comment s'assurer que l'ordre des résultats de la réponse devient un problème important.
Lors de la création de demandes asynchrones, Curl_Multi_EXEC lancera plusieurs demandes en arrière-plan en même temps et attendra toutes les demandes. Cependant, le délai d'achèvement de ces demandes est imprévisible, donc leur ordre de réponse peut être perturbé.
Pour nous assurer que les résultats sont traités dans l'ordre, nous devons utiliser un mécanisme pour enregistrer la relation de cartographie entre la demande et la réponse, une pratique courante consiste à utiliser des tableaux associatifs. Plus précisément, le développeur peut définir un identifiant unique pour chaque demande et trier correctement les résultats en fonction de cet identifiant lorsque la réponse est reçue.
Voici un exemple d'implémentation:
<?php
// DemanderURLListe
$urls = [
'https://gitbox.net/api/data1',
'https://gitbox.net/api/data2',
'https://gitbox.net/api/data3'
];
// initialisation cURL multi Poignée
$mh = curl_multi_init();
// demanderPoignée数组
$curl_handles = [];
$responses = [];
$index = 0;
// Créer pour chaque demande cURL Poignée并添加到 multi Poignée中
foreach ($urls as $url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
// Enregistrez l'index de chaque demande,Afin que les réponses soient traitées dans l'ordre
curl_multi_add_handle($mh, $ch);
// 将Poignée与索引关联
$curl_handles[(string)$ch] = $index++;
}
// Effectuer tout cURL demander
$running = null;
do {
curl_multi_exec($mh, $running);
curl_multi_select($mh); // Laissez le programme attendre que les données renvoient
} while ($running > 0);
// 读取每个demander的响应,并按demander的顺序保存结果
foreach ($curl_handles as $ch => $index) {
$response = curl_multi_getcontent($ch);
$responses[$index] = $response; // Enregistrer la réponse par index
curl_multi_remove_handle($mh, $ch); // 移除Poignée
curl_close($ch); // 关闭每个Poignée
}
// Dernière clôture multi Poignée
curl_multi_close($mh);
// Résultat de la réponse de sortie,确保按照demander顺序输出
foreach ($responses as $response) {
echo $response . PHP_EOL;
}
?>
Dans le code ci-dessus, nous initialisons d'abord une manche multimands et créons une poignée de boucle pour chaque URL. Pour nous assurer que les réponses sont retournées dans l'ordre, nous utilisons un tableau associatif $ curl_handles , qui associe chaque manche Curl à son index dans la liste des demandes.
Lorsque toutes les demandes sont remplies, nous itérons dans ce tableau associatif et stockons chaque réponse dans le tableau $ RESES en fonction de l'indice, garantissant l'ordre des réponses.
Lorsque toutes les demandes sont exécutées à l'aide de CURL_MULTI_EXEC , le paramètre d'exécution est utilisé pour indiquer le nombre de demandes qui sont toujours en cours d'exécution. CURL_MULTI_SELECT entraînera le blocage du programme lorsqu'aucune donnée n'est renvoyée jusqu'à la fin d'une demande, garantissant que nous ne gaspons pas les ressources CPU.
Enfin, nous utilisons CURL_MULTI_REMOVE_HANDLE et CURL_CLOSE pour fermer toutes les poignées Curl, et utilisons Curl_Multi_Close pour fermer plusieurs poignées Curl pour libérer des ressources connexes.
En utilisant raisonnablement les tableaux associatifs, nous pouvons nous assurer que lors de la réalisation de demandes asynchrones, les résultats de la réponse sont renvoyés dans l'ordre des demandes. Lorsque vous utilisez la série de fonctions Curl_Multi_ * pour les demandes asynchrones en PHP, il est important de maintenir l'ordre, en particulier lors de la gestion des réponses à partir de plusieurs interfaces. Grâce à cet exemple, vous pouvez mieux comprendre comment faire des demandes asynchrones en PHP et assurer la commande, l'amélioration des performances du programme et la stabilité.