Dans PHP, CURL_MULTI_EXEC et CURL_MULTI_INFO_READ sont des fonctions très pratiques si vous devez lancer plusieurs demandes HTTP en même temps et souhaiter que ces demandes soient exécutées efficacement en parallèle. Cet article présentera en détail comment utiliser ces deux fonctions pour réaliser des demandes parallèles efficaces et donner des exemples de code spécifiques.
curl_multi_exec : est utilisé pour exécuter un ensemble de poignées Curl pour implémenter le multiplexage. Il exécute toutes les demandes de jointure en parallèle.
curl_multi_info_read : utilisé pour obtenir des informations sur les demandes terminées et peut détecter si la demande est terminée, traitant ainsi le résultat correspondant.
Initialiser plusieurs demandes de boucle unique (poignées de curl).
Créez une poignée multiplexée.
Ajoutez toutes les demandes individuelles à la poignée multiplexée.
Appelez CURL_MULTI_EXEC pour commencer à exécuter toutes les demandes.
Détecter en continu si une demande a été remplie via Curl_Multi_info_read .
Traiter le résultat de la demande d'achèvement.
Nettoyez les ressources.
<?php
// DemanderURLListe
$urls = [
'http://gitbox.net/api/endpoint1',
'http://gitbox.net/api/endpoint2',
'http://gitbox.net/api/endpoint3',
];
// initialisation multi handle
$multiHandle = curl_multi_init();
$curlHandles = [];
// 1. Créer un seulcurlPoignée,Et rejoindremultiPoignée
foreach ($urls as $url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // Retour des résultats au lieu de la sortie directe
curl_multi_add_handle($multiHandle, $ch);
$curlHandles[] = $ch;
}
// 2. Effectuez toutes les demandes
$running = null;
do {
// Exécuter une demande
curl_multi_exec($multiHandle, $running);
// Facultatif:En attente d'une connexion active,prévenirCPUOccupation trop élevée
curl_multi_select($multiHandle);
// 3. Vérifiez s'il y a une demande terminée
while ($info = curl_multi_info_read($multiHandle)) {
if ($info['msg'] === CURLMSG_DONE) {
$handle = $info['handle'];
// Obtenir du contenu
$content = curl_multi_getcontent($handle);
// Traitement Retour Contenu,Par exemple, l'impression ou l'analyse
echo "Demande complète,Durée du contenu:" . strlen($content) . "\n";
// 移除完成的Poignée,Libérer les ressources
curl_multi_remove_handle($multiHandle, $handle);
curl_close($handle);
}
}
} while ($running > 0);
// 4. fermeturemultiPoignée
curl_multi_close($multiHandle);
?>
curl_multi_init () : initialisez la poignée multiplexée.
curl_multi_add_handle () : ajoute chaque poignée Curl demandée individuelle à la manche multiple.
curl_multi_exec () : exécute toutes les demandes.
curl_multi_select () : attendez la connexion active pour éviter le ralenti du CPU.
curl_multi_info_read () : lit les informations pertinentes de la demande d'achèvement et détermine si la demande est terminée.
curl_multi_remove_handle () et curl_close () : nettoyez les ressources pour éviter les fuites de mémoire.
Boucle jusqu'à ce que toutes les demandes soient terminées ( $ Running devient 0).
Le nombre de demandes parallèles ne doit pas être trop important pour éviter une pression excessive de serveur ou des goulots d'étranglement des ressources système.
Utilisez curl_multi_select () pour attendre pour empêcher le programme de tomber dans une utilisation élevée du processeur.
Lors du traitement du contenu retourné, faites attention à la vérification des erreurs pour vous assurer que la demande est réussie.
Si vous devez lancer des demandes complexes telles que la publication, l'en-tête et l'authentification, vous pouvez définir des options correspondantes lors de l'initialisation d'une seule poignée de boucle.