Position actuelle: Accueil> Derniers articles> curl_multi_close note lors de l'utilisation de curl_multi_exec

curl_multi_close note lors de l'utilisation de curl_multi_exec

gitbox 2025-05-12

Lorsque vous utilisez Curl dans PHP, Curl_Multi_Exec et Curl_Multi_Close sont des fonctions couramment utilisées qui effectuent plusieurs requêtes Curl et relâchent les ressources après avoir terminé la demande. Comprendre l'utilisation correcte de ces deux fonctions peut efficacement améliorer les performances du programme, en particulier lorsque nous devons demander simultanément plusieurs URL. Cet article introduira en détail comment utiliser correctement les fonctions Curl_Multi_Exec et Curl_Multi_Close , et discuter de certaines précautions dans une utilisation réelle.

Introduction à curl_multi_exec et curl_multi_close

curl_multi_exec :

La fonction curl_multi_exec est une fonction d'exécution multiple dans l'extension PHP Curl. Il nous permet d'exécuter plusieurs demandes de curl simultanément sans les envoyer une par une. Normalement, CURL_MULTI_EXEC est planifié sur plusieurs demandes jusqu'à ce que toutes les demandes soient remplies. Son processus d'exécution n'est pas terminé en même temps, mais nécessite des boucles pour déterminer quand l'exécution peut se poursuivre.

curl_multi_close :

curl_multi_close est utilisé pour fermer et nettoyer la poignée de session Curl créée par curl_multi_init . Il ne dégage pas automatiquement chaque poignée Curl (c'est-à-dire une poignée créée via Curl_init ), donc le développeur doit l'appeler explicitement pour libérer la ressource.

Exemple d'utilisation

Voici un exemple de PHP simple montrant comment utiliser une combinaison de curl_multi_exec et curl_multi_close pour faire des demandes simultanées.

 <?php
// initialisation cURL Conversations multiples
$multiCurl = curl_multi_init();

// demander URLs
$urls = [
    "https://gitbox.net/api/data1",
    "https://gitbox.net/api/data2",
    "https://gitbox.net/api/data3"
];

// Stocker tout cURL Poignée
$curlHandles = [];
foreach ($urls as $url) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_multi_add_handle($multiCurl, $ch);
    $curlHandles[] = $ch;
}

// mettre en œuvre cURL demander
$running = null;
do {
    curl_multi_exec($multiCurl, $running);
    curl_multi_select($multiCurl);
} while ($running > 0);

// Obtenez le résultat de retour
foreach ($curlHandles as $ch) {
    $response = curl_multi_getcontent($ch);
    echo "Response: " . $response . "\n";
}

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

// Combien est désactivé cURL Session
curl_multi_close($multiCurl);
?>

Analyse de code

  1. Initialiser plusieurs sessions :
    Utilisez la fonction curl_multi_init () pour initialiser une poignée de session Curl multiple ( $ multicurl ), qui sera utilisée par toutes les demandes de curl ultérieures.

  2. Configuration de la demande de curl :
    Liste de l'URL que nous devons demander dans le tableau $ URLS (le nom de domaine a été remplacé par Gitbox.net ici). Initialisez chaque poignée de demande via curl_init () et définissez les options nécessaires pour chaque demande.

  3. Ajoutez une poignée à plusieurs sessions :
    Chaque poignée Curl créée par Curl_Init () est ajoutée à la session multiple à l'aide de Curl_Multi_Add_Handle () .

  4. Exécuter la demande :
    Toutes les demandes Curl sont exécutées via la fonction Curl_Multi_Exec () . Cette fonction bloque jusqu'à ce que toutes les demandes soient remplies. Nous utilisons curl_multi_select () afin que le programme ne fasse pas la prochaine demande trop tôt à chaque fois la boucle.

  5. Obtenez le contenu de la réponse :
    Utilisez curl_multi_getContent () pour obtenir le résultat de retour de chaque demande.

  6. Fermez la poignée :
    Une fois toutes les demandes terminées, la poignée de chaque demande doit être fermée via curl_multi_remove_handle () et curl_close () .

  7. Fermez plusieurs séances :
    Enfin, utilisez curl_multi_close () pour fermer plusieurs sessions et libérer les ressources correspondantes.

Choses à noter

Lorsque vous utilisez CURL_MULTI_EXEC et CURL_MULTI_CLOSE , les points suivants doivent être prêts à l'attention:

  1. Limites de concurrence pour les demandes :
    Lors de l'envoi de demandes simultanées, le serveur peut avoir une limite sur le nombre de concurrence. Habituellement, nous limitons le nombre maximal de conmises, comme l'envoi jusqu'à 5 demandes à la fois, pour éviter des demandes simultanées excessives provoquant une charge de serveur excessive.

  2. Gestion des erreurs :
    Lors de l'exécution de curl_multi_exec , vous devez être conscient des erreurs possibles. Des informations d'erreur détaillées peuvent être obtenues via curl_error () pour le traitement lorsque la demande échoue.

  3. Nettoyer des ressources :
    Après avoir utilisé CURL_MULTI_CLOSE , n'oubliez pas de fermer explicitement chaque poignée de demande Curl indépendante (via curl_close () ). Si la ressource n'est pas nettoyée correctement, elle peut entraîner des fuites de mémoire ou d'autres problèmes de gestion des ressources.

  4. Attendez que toutes les demandes complètent :
    CURL_MULTI_EXEC est un processus d'exécution de boucle qui doit être assuré que les opérations suivantes se poursuivent une fois toutes les demandes terminées. curl_multi_select () bloque le programme jusqu'à ce qu'une demande soit prête.

  5. Considérations de performance :
    Lors de la gestion d'un grand nombre de demandes simultanées, le réglage raisonnable du nombre maximum de concurrents et le traitement par lots des demandes peut considérablement améliorer les performances de l'application.

Résumer

Lorsque vous utilisez CURL_MULTI_EXEC et CURL_MULTI_CLOSE Fonctions dans PHP, la gestion correcte des processus et des ressources est cruciale. En définissant raisonnablement les options de demande, en traitement des demandes simultanées et en nettoyant correctement les ressources, le programme peut être exécuté plus efficacement et de manière stable. Dans le même temps, dans le développement réel, les erreurs de gestion, la libération des ressources et le contrôle de la concurrence peuvent éviter de nombreux problèmes potentiels. J'espère que cet article vous aidera à mieux comprendre la combinaison de ces deux fonctions.