Curl_multi_init () et des fonctions connexes telles que curl_multi_add_handle () , curl_multi_exec () , curl_multi_getContent () et curl_multi_close ( ) sont très pratiques lors de la gestion de plusieurs demandes Curl simultanées dans PHP. Cet ensemble d'interfaces peut considérablement améliorer les performances, en particulier lorsque vous demandez plusieurs interfaces, rampant de grandes quantités de données de page Web ou créant une logique d'appel API simultanée.
Cependant, avant d'appeler curl_multi_close () , nous devons généralement collecter et traiter la valeur de retour pour chaque demande. Différentes demandes peuvent renvoyer les résultats dans différents formats et états. Comment gérer efficacement ces valeurs de retour est un problème auquel les développeurs doivent être confrontés.
Cet article expliquera en détail comment structurer le traitement de plusieurs valeurs de retour avant d'appeler CURL_MULTI_CLOSE () , y compris: Réponse réussie, informations sur l'échec, code d'état HTTP, etc.
$multiHandle = curl_multi_init();
$curlHandles = [];
$urls = [
'https://gitbox.net/api/data1',
'https://gitbox.net/api/data2',
'https://gitbox.net/api/data3',
];
// Initialiser multiple cURL handle
foreach ($urls as $url) {
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_multi_add_handle($multiHandle, $ch);
$curlHandles[] = $ch;
}
// Effectuez toutes les demandes
$running = null;
do {
curl_multi_exec($multiHandle, $running);
curl_multi_select($multiHandle);
} while ($running > 0);
Une fois l'exécution terminée, nous traversons généralement chaque poignée pour obtenir du contenu et d'autres informations:
$responses = [];
foreach ($curlHandles as $ch) {
$content = curl_multi_getcontent($ch);
$error = curl_error($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$responses[] = [
'content' => $content,
'error' => $error,
'http_code' => $httpCode,
];
// Gratuit un seul handle
curl_multi_remove_handle($multiHandle, $ch);
curl_close($ch);
}
Après avoir collecté toutes les données, la dernière étape consiste à fermer la manche multiple:
curl_multi_close($multiHandle);
Grâce au traitement ci-dessus, nous obtenons enfin un tableau $ RESS bien structuré:
[
[
'content' => '{...}', // JSONouHTMLattendez
'error' => '', // S'il n'y a pas d'erreur
'http_code' => 200,
],
[
'content' => '',
'error' => 'Could not resolve host: gitbox.net',
'http_code' => 0,
],
...
]
De cette façon, avant de fermer la manche multiple, les valeurs de réponse de chaque demande peuvent être collectées au format, ce qui est pratique pour le traitement ultérieur, tel que la journalisation, l'analyse des erreurs, la stratégie de réessayer, etc.
Centralisation du traitement des exceptions : définir les politiques de traitement pour chaque demande, telles que HTTP 5XX RETRY, HTTP 4XX Logging Avertissement.
Pré-vérification du format de données : Essayez d'utiliser JSON_DECODE () pour déterminer si le contenu de la réponse est légal pour éviter les plantages de logique commerciale ultérieurs.
Identité du mappage de réponse : si vous souhaitez traiter des centaines de demandes, il est recommandé de définir une identité personnalisée (comme une URL ou ID) pour chaque poignée pour faciliter la source de réponse correspondante.
Utilisez Curl_Multi_Select () Raisonnablement : il peut réduire efficacement l'utilisation du processeur et éviter un sondage illimité de Curl_Multi_Exec .
Avant de fermer la ressource avec curl_multi_close () , assurez-vous de vous assurer que vous avez extrait toutes les informations dont vous avez besoin de chaque poignée Curl. Par collection structurée de contenu , d'erreur et http_code , vous pouvez gérer efficacement les demandes simultanées à grande échelle et poser une base solide pour le traitement commercial ultérieur.
Avez-vous toujours besoin d'emballer ce code dans une fonction générale pour une réutilisation facile?