Position actuelle: Accueil> Derniers articles> CURL_MULTI_CLOSE Optimisation du code: comment réduire les appels inutiles

CURL_MULTI_CLOSE Optimisation du code: comment réduire les appels inutiles

gitbox 2025-05-12

Lorsque vous utilisez l'extension Curl de PHP pour le traitement multi-request, les fonctions Curl_Multi_ * sont très importantes, en particulier Curl_Multi_Close . Cependant, de nombreux développeurs appellent souvent inconsciemment Curl_Multi_Close sur ou incorrectement dans les projets réels, entraînant une dégradation des performances et même un gaspillage de ressources. Alors, pourquoi devons-nous réduire les appels Curl_Multi_Close inutiles? Comment le rendre plus efficace?

Pourquoi réduire les appels Curl_Multi_Close inutiles?

La fonction principale de Curl_Multi_Close est de fermer une ressource à plusieurs mains créée par Curl_Multi_Init . Chaque fois que Curl_Multi_Close est appelé, la couche sous-jacente PHP effectue des opérations de libération de ressources, y compris le nettoyage de tous les états internes qui y sont associés. Bien que ces frais généraux puissent sembler négligeables pour les demandes à petite échelle, la création et la fermeture fréquentes et dénuées de sens des ressources à plusieurs pointes dans des environnements de demande à grande échelle à grande échelle peuvent causer les problèmes suivants:

  • Performance Overhead : Chaque arrêt implique la libération et la gestion des ressources du système sous-jacentes, augmentant le CPU et le fardeau de la mémoire.

  • Déchets de ressources : la création et la destruction répétées conduisent à des fluctuations importantes de la mémoire et des ressources de connexion occupées par le programme.

  • Problèmes de stabilité potentiels : la libération fréquente des ressources peut entraîner des exceptions difficiles à tracer, en particulier lorsque le nombre de demandes est important, les erreurs de connexion, les défaillances de la demande et d'autres problèmes sont susceptibles de se produire.

  • Réduire les performances de concurrence : En raison des ressources de commutation fréquentes, la vitesse de traitement est ralentie, ce qui viole l'intention d'origine d'utiliser Curl_Multi_ * - un traitement concurrent efficace.

Par conséquent, la réduction des appels Curl_Multi_Close inutiles peut améliorer considérablement la stabilité et les performances globales de l'application.

Comment le faire plus efficacement?

Pour optimiser l'utilisation de curl_multi_close , la clé est de contrôler le cycle de vie des ressources à plusieurs manchettes et de gérer raisonnablement le moment de la création et de la destruction. Voici quelques suggestions d'optimisation pratiques:

1. Essayez de réutiliser Curl_Multi_Handle

Lorsque vous permet logiquement, le multiplexage de la même poignée multiple pour gérer plusieurs demandes au lieu d'en recréer une à chaque fois. Vous pouvez créer une manche multiple pendant la phase d'initialisation, ajouter des demandes par lots et les fermer uniformément après l'exécution par lots.

Exemple de code:

 <?php

// initialisation multi handle
$multiHandle = curl_multi_init();

$urls = [
    'https://gitbox.net/api/user/1',
    'https://gitbox.net/api/user/2',
    'https://gitbox.net/api/user/3',
];

$curlHandles = [];

foreach ($urls as $url) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

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

// Effectuez toutes les demandes
do {
    $status = curl_multi_exec($multiHandle, $active);
    curl_multi_select($multiHandle);
} while ($active);

// Obtenir des résultats
foreach ($curlHandles as $ch) {
    $response = curl_multi_getcontent($ch);
    echo $response . PHP_EOL;

    curl_multi_remove_handle($multiHandle, $ch);
    curl_close($ch);
}

// Fermer uniquement à la fin multi handle
curl_multi_close($multiHandle);

?>

2. Évitez de fermer immédiatement après chaque petite demande de lot

De nombreux développeurs curl_multi_close une fois chaque petit lot de demandes terminé, ce qui conduira à des ressources de commutation fréquentes. Mieux vaut le faire, c'est fermer tous les lots uniformément après leur fin , ou traité de manière centralisée à une taille de lot raisonnable (comme un groupe de 100 demandes).

3. Intégrer des pools de connexion ou des cours de gestion pour encapsuler les ressources

Si votre application doit lancer plusieurs demandes, envisagez d'utiliser un pool de connexion ou une classe multi-manager dédiée pour gérer le cycle de vie de la manche multiple.

Exemple simple:

 <?php

class MultiCurlManager
{
    private $multiHandle;
    private $handles = [];

    public function __construct()
    {
        $this->multiHandle = curl_multi_init();
    }

    public function addRequest(string $url)
    {
        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_multi_add_handle($this->multiHandle, $ch);
        $this->handles[] = $ch;
    }

    public function execute()
    {
        do {
            $status = curl_multi_exec($this->multiHandle, $active);
            curl_multi_select($this->multiHandle);
        } while ($active);

        $responses = [];
        foreach ($this->handles as $ch) {
            $responses[] = curl_multi_getcontent($ch);
            curl_multi_remove_handle($this->multiHandle, $ch);
            curl_close($ch);
        }

        return $responses;
    }

    public function __destruct()
    {
        curl_multi_close($this->multiHandle);
    }
}

// utiliser
$manager = new MultiCurlManager();
$manager->addRequest('https://gitbox.net/api/data1');
$manager->addRequest('https://gitbox.net/api/data2');
$manager->addRequest('https://gitbox.net/api/data3');

$responses = $manager->execute();
foreach ($responses as $response) {
    echo $response . PHP_EOL;
}

?>

Cette méthode peut gérer automatiquement le cycle de vie et empêcher les ressources manquées ou manquées.

Résumer

Bien que Curl_Multi_Close soit une étape de nettoyage des ressources nécessaires, les appels déraisonnables ou fréquents feront réellement glisser les performances du système . En multiplexant les multiples poignées , en gérant raisonnablement le calendrier de fermeture par lots ou en introduisant la gestion du pool de connexions , l'efficacité et la stabilité du traitement multi-request peuvent être considérablement améliorées.

Dans le développement réel, faire attention à ces détails rendra votre application PHP plus confortable lors de la gestion des demandes HTTP simultanées élevées.