Position actuelle: Accueil> Derniers articles> Comment nettoyer plusieurs ressources demandées simultanées à l'aide de curl_multi_close

Comment nettoyer plusieurs ressources demandées simultanées à l'aide de curl_multi_close

gitbox 2025-05-12

Lors de la gestion d'un grand nombre de demandes HTTP simultanées, les fonctions Curl_Multi Series sont un outil très pratique en PHP. Parmi eux, Curl_Multi_Close est une étape indispensable dans l'étape finale, utilisée pour libérer correctement les ressources créées par Curl_Multi_Init . Cet article expliquera l'utilisation correcte de Curl_Multi_Close et fournira un exemple pratique pour vous aider à éviter les problèmes de fuite de ressources courantes.

Pourquoi vous devez utiliser curl_multi_close

Chaque fois qu'une manche multimorl est créée à l'aide de Curl_Multi_Init , PHP alloue un morceau de mémoire pour gérer la manche multiple et les différentes demandes qu'il contient. Même si une seule poignée de clone (générée par Curl_init ) a été fermée avec Curl_close , la manche multiple globale occupera toujours les ressources système.
Si vous oubliez d'utiliser CURL_MULTI_CLOSE , il est facile de provoquer une fuite de mémoire et même le programme se bloque dans des scénarios de concurrence élevés.

Par conséquent, une fois les demandes simultanées remplies, Curl_Multi_Close doit être appelée pour libérer complètement la ressource .

Processus d'utilisation de base

Le processus général d'utilisation des fonctions de la série Curl_Multi est le suivant:

  1. Créer plusieurs manches ( curl_multi_init )

  2. Créer et configurer plusieurs poignées de curl distinctes ( curl_init )

  3. Ajoutez chaque poignée en boucle à la manche multi-manche ( curl_multi_add_handle )

  4. Exécuter et surveiller toutes les demandes ( curl_multi_exec et curl_multi_select )

  5. Supprimer une seule poignée ( curl_multi_remove_handle ) et fermer ( curl_close )

  6. Fermez enfin la manche multiple ( curl_multi_close )

Exemple: demandez simultanément plusieurs interfaces et nettoyez correctement les ressources

Voici un exemple complet montrant comment demander plusieurs URL en même temps et nettoyer correctement toutes les ressources pertinentes:

 <?php

// Pour envoyer des demandes simultanéesURLListe
$urls = [
    "https://gitbox.net/api/endpoint1",
    "https://gitbox.net/api/endpoint2",
    "https://gitbox.net/api/endpoint3",
];

// initialisation multi handle
$multiHandle = curl_multi_init();
$curlHandles = [];

// initialisation每个单独的 curl handle Et rejoindre multi handle
foreach ($urls as $key => $url) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    curl_multi_add_handle($multiHandle, $ch);
    $curlHandles[$key] = $ch;
}

// Exécuter une demande
$running = null;
do {
    $status = curl_multi_exec($multiHandle, $running);
    if ($status > CURLM_OK) {
        // Gestion des erreurs
        echo "cURL error: " . curl_multi_strerror($status);
        break;
    }

    // En attente d&#39;une connexion active
    curl_multi_select($multiHandle);
} while ($running > 0);

// Collectez les résultats de la réponse
$responses = [];
foreach ($curlHandles as $key => $ch) {
    $responses[$key] = curl_multi_getcontent($ch);
    // Retirer et fermer chaque enfant handle
    curl_multi_remove_handle($multiHandle, $ch);
    curl_close($ch);
}

// Dernière clôture multi handle
curl_multi_close($multiHandle);

// Réponse de sortie
foreach ($responses as $index => $response) {
    echo "Response from URL {$urls[$index]}:" . PHP_EOL;
    echo $response . PHP_EOL . PHP_EOL;
}
?>

Choses à noter

  • Assurez-vous d'abord de supprimer les poignées de boucle individuelles , puis de les fermer et enfin de fermer les multiples poignées.

  • Ne fermez pas directement la manche multiple puis faites fonctionner la poignée de l'enfant , car elle entraînera des erreurs imprévisibles.

  • Dans des environnements de concurrence élevés, il est recommandé d'ajouter le contrôle du délai d'attente ( curlopt_timeout ) pour éviter un blocage à long terme.

Résumer

CURL_MULTI_CLOSE est la dernière étape pour assurer la libération raisonnable des ressources. Surtout dans les scénarios multi-monnaie, il est très important de développer de bonnes habitudes de clôture. Le nettoyage correct de chaque poignée de clause et enfin la fermeture de la manche multiple peut effectivement empêcher la fuite des ressources et améliorer la stabilité et les performances des applications PHP.