En PHP, l'utilisation de Curl pour les demandes HTTP est une pratique courante, et la fonction curl_close () est utilisée pour libérer les ressources de session Curl créées par Curl_init () . Cependant, de nombreux développeurs s'inquiètent de savoir s'ils ferment vraiment complètement la connexion sous-jacente après avoir utilisé curl_close () , en particulier dans les scénarios d'application avec une concurrence élevée ou des connexions longues. Cet article explorera comment confirmer que toutes les connexions Curl sont en effet clôturées correctement après avoir appelé Curl_close () .
Curl_close ($ ch) libère simplement les ressources allouées par curl_init () , et elle ne ferme pas nécessairement immédiatement la connexion du réseau sous-jacente. Curl prend en charge la réutilisation de la connexion et la mise en commun des connexions dans son implémentation interne, en particulier lorsque Keep-Alive et HTTP / 2 Multiplexing avec HTTP / 1.1, la connexion peut être réservée aux demandes ultérieures.
Cela signifie que même si curl_close () est appelé, la connexion TCP sous-jacente peut rester ouverte et gérée par libcurl.
Étant donné que Libcurl est une bibliothèque de langage C, sa gestion interne des connexions n'est pas directement exposée aux développeurs PHP. Par conséquent, il est impossible de "confirmer" directement si la connexion a été déconnectée du niveau du système via des moyens natifs de PHP.
Cependant, une confirmation ou une gestion indirecte peut être effectuée de la manière suivante:
Vous pouvez obtenir la sortie de débogage de Curl en définissant Curlopt_verbose pour observer l'établissement et la fermeture de la connexion:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://gitbox.net/api/check');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_VERBOSE, true); // Activer la sortie de débogage
$verbose = fopen('php://temp', 'w+');
curl_setopt($ch, CURLOPT_STDERR, $verbose);
$response = curl_exec($ch);
curl_close($ch);
rewind($verbose);
$verboseLog = stream_get_contents($verbose);
fclose($verbose);
echo "cURL Informations de débogage:\n";
echo $verboseLog;
En débogues des informations, vous pouvez voir si des mots tels que la «connexion de clôture» ou la «connexion sont toujours utilisés», ce qui contribue à analyser si la connexion est réellement fermée.
Pour forcer la connexion à fermer, le comportement de multiplexage peut être explicitement désactivé:
curl_setopt($ch, CURLOPT_FORBID_REUSE, true);
Ce paramètre indique à Curl de ne pas réutiliser la connexion et de forcer la fermeture de la connexion sous-jacente une fois la demande terminée. Ceci est particulièrement important dans les scénarios où les connexions doivent être assurées ne sont pas conservées, mais peuvent entraîner des pertes de performances.
Côté serveur, vous pouvez utiliser les commandes NetStat , LSOF ou SS pour effectuer la comparaison d'état avant et après l'exécution du script:
netstat -anp | grep :443
ou:
lsof -i :443
Cependant, cela ne s'applique qu'aux environnements de débogage. Il n'est pas conseillé d'utiliser ces commandes fréquemment dans les environnements de production pour prévenir les impacts des performances.
La libération de ressources est plus compliquée lors de l'utilisation de la série de fonctions Curl_Multi_ * . Même si chaque poignée est fermée, curl_multi_close () doit être appelée:
$mh = curl_multi_init();
// Ajouter plusieurs curl handle
// ...
curl_multi_close($mh);
CURL_MULTI_CLOSE () manquant peut entraîner une recyclage correctement certaines connexions.
Certains cadres (comme Guzzle) utilisent également Curl, mais peuvent implémenter la logique de regroupement de connexion elle-même. Dans ce cas, même si vous fermez la poignée dans un script PHP, la connexion peut toujours être gérée par le cadre et ne peut pas être fermée immédiatement. Dans ce scénario, vous devez vérifier la stratégie de multiplexage de connexion du cadre.
Bien que Curl_close () soit une pratique standard en PHP pour libérer des ressources, il ne garantit pas entièrement que la connexion sous-jacente est fermée immédiatement. Pour confirmer si la connexion est fermée, vous pouvez:
Utilisez curlopt_verbose pour produire le journal de débogage;
Définissez Curlopt_forbid_reuse pour forcer la déconnexion;
Utilisez des commandes système pour observer l'état de connexion lors du débogage;
Fermez correctement la poignée multibourl;
Comprendre le cadre ou l'environnement utilisé pour gérer les connexions.
Comprendre ces mécanismes peut aider à créer une logique client HTTP plus efficace et contrôlable.