Position actuelle: Accueil> Derniers articles> Utilisez curl_multi_close dans le bon ordre avec curl_multi_init

Utilisez curl_multi_close dans le bon ordre avec curl_multi_init

gitbox 2025-05-12

Dans PHP, Curl est un outil de demande de réseau puissant et couramment utilisé, et la série de fonctions Curl_Multi_ * nous le permet. Ceci est très utile dans des scénarios tels que l'agrégation d'interface haute performance, les demandes asynchrones, etc.

Cependant, de nombreux développeurs ignorent souvent le processus de libération des ressources lors de l'utilisation de Curl_Multi_ * , en particulier l'utilisation de Curl_Multi_Close () . Cet article prendra le processus standard comme ligne principale et vous amènera à comprendre l'utilisation complète de Curl_Multi_Init à Curl_Multi_Close étape par étape, et sera complété par des exemples de code.

1. Quelle est la fonction Curl_Multi Series?

La série Curl_Multi_ * de fonctions fournies par PHP est des outils pour gérer plusieurs poignées Curl simultanées . Ceci est différent de la demande traditionnelle de boucle unique, qui vous permet de lancer plusieurs demandes HTTP en même temps, améliorant l'efficacité de la réponse.

L'utilisation de ces fonctions peut être à peu près divisée en étapes suivantes:

  1. Initialiser Multi Handle: Curl_Multi_Init ()

  2. Ajouter plusieurs demandes de curl (poignée facile): curl_multi_add_handle ()

  3. Exécuter les demandes: curl_multi_exec () et curl_multi_select ()

  4. Obtenez le contenu de la réponse: curl_multi_getContent ()

  5. Supprimer et fermer la poignée facile: curl_multi_remove_handle () et curl_close ()

  6. Fermer plusieurs manches: curl_multi_close ()

2. Explication du processus standard et exemples de code

Voici un processus multi-request standard, en supposant que nous devons demander simultanément trois URL différentes:

 <?php

// Demander URL Liste
$urls = [
    "https://gitbox.net/api/service1",
    "https://gitbox.net/api/service2",
    "https://gitbox.net/api/service3"
];

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

// 1. Pour chacun URL Créer un curl easy handle et ajouter à multi handle milieu
foreach ($urls as $i => $url) {
    $ch = curl_init();

    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

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

// 2. mettre en œuvre multi demander
$active = null;
do {
    $mrc = curl_multi_exec($multiHandle, $active);
    // En attente d&#39;Internet I/O Se préparer,éviter CPU Occupation trop élevée
    if ($mrc == CURLM_OK) {
        curl_multi_select($multiHandle);
    }
} while ($active > 0 && $mrc == CURLM_OK);

// 3. Obtenez du contenu et des poignées propres
$responses = [];
foreach ($curlHandles as $i => $ch) {
    // Obtenez le contenu de la réponse
    $responses[$i] = curl_multi_getcontent($ch);

    // Retirer et fermer un seul handle
    curl_multi_remove_handle($multiHandle, $ch);
    curl_close($ch);
}

// 4. Dernière clôture multi handle,Libérer les ressources
curl_multi_close($multiHandle);

// Résultat de sortie
foreach ($responses as $index => $body) {
    echo "Response from URL #{$index}: \n";
    echo $body . "\n\n";
}

3. Pourquoi Curl_Multi_Close est-il important?

Bien que Curl_Multi_Close () ne détruise pas immédiatement la poignée facile (vous devez les retirer et les fermer en premier), il est responsable de la libération des ressources sous-jacentes occupées par la manche multiple elle-même . Si vous oubliez de l'appeler, cela peut provoquer des fuites de mémoire ou l'épuisement des descripteurs de fichiers dans des scripts de longue date tels que les processus résidents.

Résumé: Tout script qui utilise Curl_Multi_Init () doit se terminer par Curl_Multi_Close () !

4. Questions fréquemment posées

  1. Vous demandez le blocage et coincé?

    • Vérifiez si curl_multi_select () est utilisé correctement.

    • Assurez-vous que Curl_setopt (..., curlopt_returntransfer, true) n'est pas manqué.

  2. Exception de fuite de mémoire ou de connexion?

    • Curl_multi_remove_handle () et curl_close () sont-ils appelés après chaque demande?

    • Curl_multi_close () est-il finalement appelé?

5. Résumé

CURL_MULTI_ * fournit un moyen très efficace lors du traitement des demandes de réseau simultanément. La maîtrise du processus complet de curl_multi_init () à curl_multi_close () peut efficacement améliorer les capacités des performances du code et de la gestion des ressources.

Rappelez-vous ces trois "must":

  • Chaque demande doit être ajoutée à la manche multiple;

  • Chaque demande doit être supprimée et fermée à la fin;

  • Enfin, Curl_Multi_close () doit être appelé pour libérer la multi-ressources.

Grâce à la gestion standardisée des processus et des ressources, vos demandes simultanées PHP seront plus robustes et efficaces.