Position actuelle: Accueil> Derniers articles> Comment utiliser correctement Curl_Multi_Close pendant la gestion des erreurs

Comment utiliser correctement Curl_Multi_Close pendant la gestion des erreurs

gitbox 2025-05-29

Lorsque vous utilisez CURL pour plusieurs demandes en PHP, la série de fonctions Curl_Multi_ * peut améliorer considérablement les performances du programme, en particulier dans le scénario des demandes simultanées. Cependant, de nombreux développeurs ont tendance à ignorer certains problèmes de gestion des erreurs et de libération des ressources clés lors de l'utilisation de ces fonctions, en particulier l'utilisation de curl_multi_close . Si curl_multi_close est appelé incorrectement, il peut entraîner une fuite de ressources, des problèmes de performances et même des problèmes de débordement de mémoire.

Cet article expliquera en détail comment utiliser correctement la fonction curl_multi_close lors de la gestion des erreurs pour éviter la fuite des ressources et d'autres problèmes potentiels.

1. Quelle est la fonction curl_multi_close ?

La fonction CURL_MULTI_CLOSE est une fonction dans l'extension Curl PHP qui ferme toutes les poignées initialisées dans une session Curl multiple. La fonction Curl_Multi_ * permet de exécuter plusieurs demandes Curl en parallèle, tandis que CURL_MULTI_CLOSE est utilisé pour clôturer correctement chaque session Curl une fois toutes les demandes terminées pour libérer des ressources.

2. Utilisez correctement Curl_Multi_Close

Lors de l'exécution de plusieurs demandes simultanées, nous devons utiliser CURL_MULTI_INIT pour initialiser une ressource multi-session, puis utiliser Curl_Multi_Add_Handle pour ajouter chaque session Curl individuelle à cette multi-session. Une fois la demande terminée, Curl_Multi_Close doit être appelé pour fermer la ressource multi-sessions.

Exemple de code:

 // Combien d'initialisationcURLSession
$mh = curl_multi_init();
$ch1 = curl_init();
$ch2 = curl_init();

// installationcURLOptions
curl_setopt($ch1, CURLOPT_URL, "https://gitbox.net/api/endpoint1");
curl_setopt($ch2, CURLOPT_URL, "https://gitbox.net/api/endpoint2");
curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);

// 添加Session到多重Session资源中
curl_multi_add_handle($mh, $ch1);
curl_multi_add_handle($mh, $ch2);

// Effectuez plusieurs demandes
do {
    $status = curl_multi_exec($mh, $active);
    if ($active) {
        // Attendez que la demande se termine
        curl_multi_select($mh);
    }
} while ($active && $status == CURLM_OK);

// Obtenir et traiter les données de retour
$response1 = curl_multi_getcontent($ch1);
$response2 = curl_multi_getcontent($ch2);

// fermeturecURLSession
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);

// 最后fermeture多重cURLSession
curl_multi_close($mh);

3. CURL_MULTI_CLOSE dans la gestion des erreurs

La gestion des erreurs est une partie cruciale de plusieurs demandes. Lors de l'exécution de plusieurs demandes, diverses erreurs peuvent être rencontrées, notamment le délai d'expiration de connexion, la réponse non valide, l'erreur de serveur, etc. Pour éviter que la ressource ne soit publiée lorsqu'une erreur se produit, un coup de main peut être utilisé pour assurer des exceptions pour s'assurer que la ressource est correctement fermée, que la demande soit réussie ou non.

Exemple de code d'erreur:

 try {
    // Combien d'initialisationcURLSession
    $mh = curl_multi_init();
    $ch1 = curl_init();
    $ch2 = curl_init();

    // installationcURLOptions
    curl_setopt($ch1, CURLOPT_URL, "https://gitbox.net/api/endpoint1");
    curl_setopt($ch2, CURLOPT_URL, "https://gitbox.net/api/endpoint2");
    curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);

    // 添加Session到多重Session资源中
    curl_multi_add_handle($mh, $ch1);
    curl_multi_add_handle($mh, $ch2);

    // Effectuez plusieurs demandes
    do {
        $status = curl_multi_exec($mh, $active);
        if ($active) {
            // Attendez que la demande se termine
            curl_multi_select($mh);
        }
    } while ($active && $status == CURLM_OK);

    // Vérifiez les résultats de chaque demande
    if ($status != CURLM_OK) {
        throw new Exception("cURLÉchec de la demande,Code d'erreur:" . $status);
    }

    // Obtenir et traiter les données de retour
    $response1 = curl_multi_getcontent($ch1);
    $response2 = curl_multi_getcontent($ch2);

    // Traiter les données renvoyées ici...

} catch (Exception $e) {
    // Partie de gestion des erreurs:Journal d'erreur de journal
    error_log("Échec de la demande:" . $e->getMessage());
} finally {
    // Assurez-vous qu'il y a des erreurs ou non,Les ressources seront publiées correctement
    if (isset($mh)) {
        // fermetureSession资源
        if (isset($ch1)) {
            curl_multi_remove_handle($mh, $ch1);
            curl_close($ch1);
        }
        if (isset($ch2)) {
            curl_multi_remove_handle($mh, $ch2);
            curl_close($ch2);
        }
        curl_multi_close($mh);
    }
}

4. Pourquoi avez-vous besoin d'utiliser correctement Curl_Multi_Close ?

Si CURL_MULTI_CLOSE n'est pas appelé une fois la demande terminée, la session PHP occupera les ressources système, entraînant des fuites de mémoire et des problèmes de performances. Dans le cas de plusieurs demandes, des poignées de boucle non clôturées peuvent s'accumuler au fil du temps, affectant la stabilité du programme et même provoquer le casque du processus. Par conséquent, il est crucial d'utiliser correctement Curl_Multi_Close .

5. Causes courantes de fuite de ressources

Les fuites de ressources se produisent généralement dans les situations suivantes:

  • J'ai oublié d'appeler la fonction curl_multi_close .

  • Lorsqu'une erreur se produit, le programme ne parvient pas à entrer le bloc final pour libérer la ressource.

  • Dans une boucle ou une demande répétée, une nouvelle session est créée à plusieurs reprises, mais l'ancienne session n'est pas fermée.

La meilleure pratique pour éviter ces problèmes consiste à toujours utiliser la structure essai-capture-finale pour s'assurer que toutes les sessions peuvent être fermées correctement même s'il y a des erreurs.

6. Résumé

Une utilisation appropriée de curl_multi_close est une étape critique pour éviter la fuite des ressources et d'autres problèmes de performances. Lorsque des demandes simultanées, nous devons toujours prêter attention à la gestion des erreurs et à la gestion des ressources. Assurer la libération correcte des ressources après chaque demande par le biais de la structure TRY-Patch-finalement assure la stabilité de l'application dans un environnement de concurrence élevé.

Dans le développement réel, nous devons toujours faire attention à gérer chaque session Curl pour éviter de manquer la fermeture des ressources en cas de défaillance de la demande ou d'autres erreurs. Ce n'est que de cette manière que nos multiples demandes de boucle peuvent être plus efficaces et stables, évitant les fuites de mémoire potentielles et les goulots d'étranglement de performances.