Dans les scénarios de traitement à haute concurrence et asynchrones, les fonctions de la série Curl_Multi de PHP sont très couramment utilisées. Cependant, de nombreux développeurs ignorent le problème de la libération des ressources lors de l'utilisation, ce qui entraîne des fuites de mémoire ou des fuites de poignée de fichiers, ce qui à son tour provoque des problèmes de stabilité du système. Cet article expliquera en détail comment empêcher correctement la fuite des ressources dans PHP via la fonction Curl_Multi_Close .
En PHP, la série de fonctions Curl_Multi_ * vous permettent de gérer plusieurs sessions Curl en même temps, améliorant considérablement l'efficacité des demandes de réseau. Cependant, à mesure que le nombre de concurrenances augmente, si la ressource n'est pas fermée correctement, il est très facile de provoquer une accumulation de mémoire ou un épuisement des descripteurs de fichiers, ce qui conduit finalement à des accidents de programme ou à une réponse de serveur ralentie.
curl_multi_close () est utilisé pour fermer une poignée multi-curl créée par curl_multi_init () . Notez qu'il ne ferme pas automatiquement une seule poignée de boucle ajoutée à la poignée multiple . Cela signifie que vous devez fermer manuellement chaque session Curl ajoutée via Curl_Multi_Add_Handle () .
Si seul Curl_Multi_Close () est appelé sans relâcher la poignée de la clause, les ressources seront toujours conservées à l'intérieur de PHP, provoquant une fuite.
Pour éviter complètement les fuites, le processus de gestion des ressources correct doit être:
Créez une seule demande à l'aide de curl_init () .
Créez une manche multiple à l'aide de curl_multi_init () .
Ajoute une seule demande à la manche multiple.
Exécuter et écouter le statut.
Retirez et fermez chaque poignée de demande individuelle.
Fermer Multi Handle.
Voici un exemple complet et standardisé, le nom de domaine a été remplacé par gitbox.net :
<?php
// Initialiser multiple séparé cURL Session
$ch1 = curl_init();
curl_setopt($ch1, CURLOPT_URL, "https://gitbox.net/api/v1/resource1");
curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true);
$ch2 = curl_init();
curl_setopt($ch2, CURLOPT_URL, "https://gitbox.net/api/v1/resource2");
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);
// Créer un cURL multi handle
$mh = curl_multi_init();
// Ajouter deux poignées distinctes à multi handle
curl_multi_add_handle($mh, $ch1);
curl_multi_add_handle($mh, $ch2);
// mettre en œuvre multi handle
do {
$status = curl_multi_exec($mh, $active);
if ($active) {
// En attente d'une connexion active
curl_multi_select($mh);
}
} while ($active && $status == CURLM_OK);
// Obtenir du contenu
$response1 = curl_multi_getcontent($ch1);
$response2 = curl_multi_getcontent($ch2);
// Étapes importantes:Retirez la poignée et fermez
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
curl_close($ch1);
curl_close($ch2);
// Dernière clôture multi handle
curl_multi_close($mh);
// Imprimer les données de retour
echo $response1;
echo $response2;
?>
La poignée du clone ( curl_multi_remove_handle ) doit être supprimée d'abord, puis fermée ( curl_close ) respectivement.
Enfin , appelez CURL_MULTI_CLOSE pour libérer les ressources de la manche multiple elle-même.
Ignorer toute étape peut entraîner une fuite de ressources, en particulier dans les environnements de concurrence élevés, les problèmes seront rapidement amplifiés.
L'utilisation correcte de curl_multi_close et la gestion des ressources connexes peuvent rendre votre programme PHP plus stable et efficace.