Dans PHP, Curl est une bibliothèque puissante qui nous permet d'envoyer des demandes via plusieurs protocoles, tels que HTTP, HTTPS, FTP, etc. La série de fonctions Curl_Multi_ * nous permet d'émettre plusieurs demandes asynchrones en même temps, améliorant ainsi les performances et réduisant le temps de demande. Les demandes asynchrones sont très utiles, en particulier lorsque plusieurs demandes HTTP sont nécessaires.
Cependant, lorsque vous utilisez la fonction Curl_Multi_ * pour les demandes asynchrones, il existe un piège commun: la fermeture de connexions à plusieurs reprises . Lorsque nous fermons une session CURL via la fonction Curl_Multi_Close , si la connexion n'est pas correctement gérée, certaines connexions peuvent être fermées à plusieurs reprises avant qu'elles ne soient pas correctement fermées, provoquant une erreur ou une fuite de mémoire.
Cet article vous montrera comment utiliser correctement Curl_Multi_Close en PHP pour gérer les demandes asynchrones et éviter la fermeture répétée des connexions.
Tout d'abord, jetons un coup d'œil à utiliser la fonction de la série Curl_Multi_ * de PHP pour initier plusieurs demandes asynchrones. Voici un exemple de base:
<?php
// Créer plusieurs cURL Session
$ch1 = curl_init();
$ch2 = curl_init();
// installation cURL Demander des options
curl_setopt($ch1, CURLOPT_URL, 'https://gitbox.net/api/endpoint1');
curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch2, CURLOPT_URL, 'https://gitbox.net/api/endpoint2');
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);
// créer cURL Plusieurs poignées
$mh = curl_multi_init();
// Mettre chacun cURL Session加入Plusieurs poignées
curl_multi_add_handle($mh, $ch1);
curl_multi_add_handle($mh, $ch2);
// Effectuer des demandes asynchrones
do {
$status = curl_multi_exec($mh, $active);
} while ($active);
// Obtenez le résultat de chaque demande
$response1 = curl_multi_getcontent($ch1);
$response2 = curl_multi_getcontent($ch2);
// Résultat de sortie
echo "Response 1: " . $response1 . "\n";
echo "Response 2: " . $response2 . "\n";
// 关闭Session
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
curl_multi_close($mh);
curl_close($ch1);
curl_close($ch2);
?>
Dans cet exemple, nous créons deux sessions Curl et configurons l'URL de demande, et utilisons la fonction Curl_Multi_ * pour émettre deux demandes asynchrones en même temps. CURL_MULTI_EXEC s'exécutera jusqu'à ce que toutes les demandes soient remplies. Ensuite, nous utilisons Curl_Multi_getContent pour obtenir le résultat de retour et finalement fermer toutes les sessions.
Dans le code ci-dessus, nous avons utilisé CURL_MULTI_CLOSE pour fermer le multi-mains CURL et utilisé Curl_close pour fermer chaque session Curl individuelle. Il s'agit d'une pratique courante, mais il convient de noter que Curl_Multi_Close n'est responsable que de la fermeture de plusieurs poignées et ne ferme pas chaque poignée de session. Ainsi, après la fermeture de Curl_Multi_Close , chaque curl_close doit encore être fermée via curl_close .
Problème: Si vous appelez à plusieurs reprises Curl_close ou Curl_Multi_Close dans certains cas, vous pouvez avoir le problème de la fermeture répétée de la connexion. Pour éviter cela, nous pouvons prendre deux méthodes:
Assurez-vous que chaque poignée est fermée une seule fois <br> Pendant les boucles ou le traitement, nous pouvons fermer accidentellement certaines sessions à plusieurs reprises. Pour éviter ce problème, vous pouvez faire une marque lors de la fermeture, en vous assurant que chaque poignée n'est fermée qu'une seule fois.
Retirez d'abord la poignée, puis fermez-la <br> Utilisez CURL_MULTI_REMOVE_HANDLE pour retirer la poignée, en vous assurant que chaque poignée est retirée des multiples poignées lors de la fermeture. Cela évite que les poignées fermées apparaissent lorsque Curl_Multi_Close est appelé.
Pour éviter la fermeture répétée des connexions, nous avons amélioré le code:
<?php
// Créer plusieurs cURL Session
$ch1 = curl_init();
$ch2 = curl_init();
// installation cURL Demander des options
curl_setopt($ch1, CURLOPT_URL, 'https://gitbox.net/api/endpoint1');
curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch2, CURLOPT_URL, 'https://gitbox.net/api/endpoint2');
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);
// créer cURL Plusieurs poignées
$mh = curl_multi_init();
// Mettre chacun cURL Session加入Plusieurs poignées
curl_multi_add_handle($mh, $ch1);
curl_multi_add_handle($mh, $ch2);
// Effectuer des demandes asynchrones
do {
$status = curl_multi_exec($mh, $active);
} while ($active);
// Obtenez le résultat de chaque demande
$response1 = curl_multi_getcontent($ch1);
$response2 = curl_multi_getcontent($ch2);
// Résultat de sortie
echo "Response 1: " . $response1 . "\n";
echo "Response 2: " . $response2 . "\n";
// 移除句柄后再关闭Session
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
// Fermer correctement
curl_multi_close($mh);
curl_close($ch1);
curl_close($ch2);
?>
Utilisez la fonction Curl_Multi_ * pour lancer efficacement plusieurs demandes asynchrones pour améliorer les performances.
Lors de la fermeture d'une session Curl, assurez-vous d'utiliser Curl_Multi_Remove_Handle pour supprimer la session, puis appelez Curl_Multi_Close .
Chaque session CURL doit être fermée via Curl_close avant la fermeture, en évitant la fermeture répétée dans curl_multi_close .
En gérant correctement la fermeture des connexions, nous pouvons éviter les fermetures répétées de connexions, garantissant que le code est plus stable et efficace.