Lors de la réalisation d'un grand nombre de demandes HTTP, le curl_multi_exec fourni par PHP est un outil commun pour implémenter des demandes simultanées. Cependant, de nombreux développeurs ignorent un détail clé lors de l'utilisation: le bon moment de Curl_close . S'il est mal utilisé, cela entraînera non seulement une fuite de ressources, mais peut également entraîner des problèmes tels que des demandes incomplètes et des réponses anormales. Cet article expliquera en profondeur comment utiliser correctement la fonction Curl_close et coopérer avec Curl_Multi_EXEC pour obtenir un traitement de demande HTTP lot efficace et stable.
CURL_MULTI_EXEC est l'une des fonctions fournies par l'extension PHP Curl, qui nous permet d'ajouter plusieurs poignées de demande Curl à une manche multi-multiples et d'exécuter ces demandes simultanément de manière non bloquante. Par rapport aux demandes de série traditionnelles, il peut améliorer considérablement l'efficacité du traitement.
De nombreux développeurs appellent immédiatement Curl_close ($ ch) pour libérer des ressources après le traitement d'une demande, ce qui est incorrect. Dans un modèle de concurrence à l'aide de curl_multi_exec :
$mh = curl_multi_init();
$chs = [];
foreach ($urls as $url) {
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_multi_add_handle($mh, $ch);
$chs[] = $ch;
// Mauvaise façon:N'appelle pas ici curl_close
// curl_close($ch);
}
Le processus d'utilisation correcte de curl_multi_exec et curl_close est le suivant:
Initialiser la manche multiple;
Créer plusieurs poignées de curl et définir des options;
Ajoutez la poignée de boucle à la poignée multiple;
Exécuter la demande;
Retirez les poignées une par une et appelez curl_close ;
Fermez la manche multiple.
Voici un exemple complet et correct:
$urls = [
'https://gitbox.net/api/endpoint1',
'https://gitbox.net/api/endpoint2',
'https://gitbox.net/api/endpoint3',
];
$mh = curl_multi_init();
$handles = [];
$responses = [];
// 1. Créer et configurer chacun curl Poignée
foreach ($urls as $i => $url) {
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 10,
]);
curl_multi_add_handle($mh, $ch);
$handles[$i] = $ch;
}
// 2. Effectuer des demandes simultanées
$running = null;
do {
$status = curl_multi_exec($mh, $running);
if ($running) {
curl_multi_select($mh);
}
} while ($running && $status == CURLM_OK);
// 3. Lisez la réponse et nettoyez les ressources
foreach ($handles as $i => $ch) {
$responses[$i] = curl_multi_getcontent($ch);
curl_multi_remove_handle($mh, $ch);
curl_close($ch); // Le bon moment:exister handle Fermer après avoir été supprimé
}
curl_multi_close($mh);
// Facultatif:Traitement des données de réponse
foreach ($responses as $i => $body) {
echo "Response #$i: " . substr($body, 0, 100) . PHP_EOL;
}
Ne fermez pas la poignée de boucle à l'avance . Vous devez vous assurer que la demande a été exécutée et a été supprimée de la manche multiple avant d'appeler Curl_close .
Curl_Multi_Select est la clé pour améliorer les performances, et il peut empêcher le ralenti du CPU.
Toutes les poignées doivent être correctement publiées à la fin par Curl_Multi_Remove_Handle et Curl_Close , sinon des fuites de mémoire peuvent se produire.
Si le nom de domaine URL utilisé est fixe, il peut être géré de manière centralisée via une configuration unifiée ou un remplacement variable, tels que:
$domain = 'gitbox.net';
$url = "https://{$domain}/api/endpoint";
En gérant correctement le calendrier d'utilisation de Curl_Multi_Exec et Curl_Close , l'efficacité et la stabilité du traitement de la demande HTTP par lots PHP peuvent être considérablement améliorées. Ce processus est particulièrement adapté à la collecte de données à haute monnaie, à l'agrégation API et à d'autres scénarios d'application, et est une compétence que chaque développeur PHP mérite de maîtriser.