Position actuelle: Accueil> Derniers articles> Comment éviter les fuites de connexion après curl_multi_close

Comment éviter les fuites de connexion après curl_multi_close

gitbox 2025-05-12

Dans la programmation PHP, Curl_Multi_Close est une fonction utilisée pour fermer plusieurs connexions Curl. Il est généralement utilisé avec CURL_MULTI_INIT et CURL_MULTI_EXEC pour effectuer des opérations de demande HTTP simultanées. Cependant, bien que Curl_Multi_Close soit conçu pour fermer les connexions et les ressources gratuites, une mauvaise utilisation peut entraîner des fuites de connexions. Cet article explorera comment éviter les fuites de connexion après Curl_Multi_Close et donner des exemples de code réels.

Qu'est-ce qu'une fuite de connexion en boucle?

Une fuite de connexion fait référence à l'échec du programme à fermer ou à libérer une connexion réseau ouverte normalement lors de l'exécution. Ce problème conduit souvent à un gaspillage de ressources système, en particulier lorsqu'un grand nombre de demandes simultanées sont nécessaires. Curl est un outil important en PHP pour gérer les demandes HTTP. Il nous permet de faire des demandes simultanées via la série de fonctions Curl_Multi_ * . Mais si la connexion est clôturée de manière incorrecte, elle peut entraîner l'ouverture de la connexion en arrière-plan, provoquant finalement une fuite.

Causes communes de fuite de connexion en boucle

  1. La poignée n'est pas fermée correctement:
    Même après que Curl_Multi_Close est appelé, les fuites de connexion peuvent se produire si chaque poignée de boucle individuelle n'est pas fermée correctement.

  2. Gestion de la gestion des erreurs:
    Si la poignée Curl est supprimée ou réutilisée de manière incorrecte lors de l'exécution de la demande, la connexion peut ne pas être fermée correctement.

  3. Utilisez une URL inappropriée:
    Au cours de plusieurs demandes, différentes URL sont utilisées, mais les connexions demandées ne sont pas correctement libérées, ce qui peut également provoquer des fuites.

Comment éviter les fuites de connexion en boucle

Afin d'éviter les fuites de connexion après avoir appelé CURL_MULTI_CLOSE , nous devons assurer les aspects suivants de la manipulation:

1. Assurez-vous que chaque poignée de boucle est clôturée correctement

Lors de la fermeture de plusieurs demandes Curl avec Curl_Multi_Close , assurez-vous que chaque poignée Curl est correctement fermée. Pour fermer une poignée Curl pour une seule demande, vous devez utiliser la fonction curl_close () .

2. Gratuit toutes les ressources

Assurez-vous que toutes les ressources Curl ont été correctement nettoyées, y compris le corps de réponse et la poignée de demande avant d'appeler Curl_Multi_Close .

3. Utilisez CURL_MULTI_ADD_HANDLE et CURL_MULTI_REMOVE_HANDLE correctement

Avant que chaque demande ne soit exécutée, assurez-vous d'ajouter la poignée à Curl_Multi , et une fois la demande terminée, retirez correctement la poignée et ne réutilisez pas la poignée fermée.

Exemple de code

Voici un exemple PHP simple montrant comment utiliser correctement la fonction Curl_Multi_ * et éviter la fuite de connexion:

 <?php
// initialisation multi-curl Poignée
$mh = curl_multi_init();

// URL Liste
$urls = [
    "https://gitbox.net/api/endpoint1",
    "https://gitbox.net/api/endpoint2",
    "https://gitbox.net/api/endpoint3"
];

$handles = [];

// créer cURL 请求Poignée
foreach ($urls as $i => $url) {
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_TIMEOUT, 10);
    curl_multi_add_handle($mh, $ch);
    $handles[$i] = $ch;
}

// Exécuter une demande
do {
    $status = curl_multi_exec($mh, $active);
    if ($active) {
        curl_multi_select($mh);
    }
} while ($active && $status == CURLM_OK);

// Fermer chacun cURL Poignée
foreach ($handles as $ch) {
    curl_multi_remove_handle($mh, $ch);
    curl_close($ch);
}

// Dernière clôture multi-curl Poignée
curl_multi_close($mh);

echo "Toutes les demandes ont été remplies et la connexion est clôturée correctement。";
?>

Analyse de code

  1. Initialisez la manche multiples Curl:
    Utilisez CURL_MULTI_INIT pour initialiser une nouvelle poignée multi-curl.

  2. Créer et ajouter plusieurs demandes de curl:
    Nous initialisons chaque poignée de demande via curl_init et les ajoutons à la poignée multi-curl à l'aide de curl_multi_add_handle .

  3. Effectuez des demandes simultanées:
    Toutes les demandes sont exécutées à l'aide de CURL_MULTI_EXEC et de blocage et d'attente via Curl_Multi_Select jusqu'à ce que toutes les demandes soient remplies.

  4. Retirez et fermez la poignée:
    Une fois la demande terminée, nous supprimons chaque poignée CURL via Curl_Multi_Remove_Handle et les fermons avec Curl_close pour s'assurer que la connexion est libérée.

  5. Fermez la poignée multi-curl:
    Enfin, appelez Curl_Multi_Close pour fermer la poignée multi-curl et libérer la ressource.

Résumer

En utilisant correctement CURL_MULTI_ADD_HANDLE et CURL_MULTI_REMOVE_HANDLE pour gérer les poignées de demande et assurer la libération des ressources après chaque demande, nous pouvons éviter efficacement la fuite de connexion après Curl_Multi_Close . N'oubliez pas non plus de garder l'URL cohérente lors du traitement de l'URL et assurez-vous que chaque demande est traitée correctement. Suivre ces meilleures pratiques peut améliorer la stabilité du programme et éviter les problèmes de performance potentiels.