Position actuelle: Accueil> Derniers articles> Comment combiner curl_multi_select () et curl_upkeed () pour optimiser la connexion

Comment combiner curl_multi_select () et curl_upkeed () pour optimiser la connexion

M66 2025-06-06

Lors de la réalisation de demandes HTTP à grande échelle, la bibliothèque Curl de PHP est un outil très puissant qui peut nous aider à faire des demandes simultanées et à améliorer les performances. Cependant, le simple fait de placer plusieurs demandes ne conduit pas nécessairement à des performances optimales, car nous devons gérer efficacement la connexion. Afin d'obtenir une optimisation de connexion plus efficace, vous pouvez utiliser les fonctions Curl_upKeep () et Curl_Multi_Select () pour réduire les frais généraux de connexion.

1. Que sont Curl_upkeep () et Curl_Multi_Select () ?

  • curl_upkeep () : Cette fonction est principalement utilisée pour gérer les connexions de curl initialisées, garantissant qu'ils restent valides lorsqu'ils sont utilisés et peuvent économiser des ressources en gardant la réutilisation des connexions, en réduisant les processus d'établissement de connexion en double.

  • curl_multi_select () : Cette fonction est utilisée avec curl_multi_exec () , ce qui peut nous aider à optimiser l'efficacité d'exécution des demandes Curl multitâche. Sa fonction est de bloquer l'attente d'au moins une poignée de boucle pour être prête, adaptée à une gestion efficace d'un grand nombre de demandes simultanées.

En combinant ces deux fonctions, le retard au cours de chaque demande peut être considérablement réduit et l'efficacité de traitement simultanée entre plusieurs demandes peut être améliorée.

2. Multitâche Curl de base

Avant d'introduire comment utiliser curl_upkeep () et curl_multi_select () , passons en revue comment effectuer le multitâche de base. Le code suivant montre comment utiliser curl_multi_init () et curl_multi_exec () pour faire des demandes simultanées.

 // Initialiser multiplecURLPoignée
$mh = curl_multi_init();
$handles = [];

$urls = [
    'https://m66.net/api/data1',
    'https://m66.net/api/data2',
    'https://m66.net/api/data3'
];

// En créer un pour chaque demandecURLPoignée
foreach ($urls as $url) {
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_multi_add_handle($mh, $ch);
    $handles[] = $ch;
}

// Effectuer des demandes multitâches
do {
    $status = curl_multi_exec($mh, $active);
    if ($active) {
        curl_multi_select($mh); // Bloquer jusqu'à ce qu'il y ait une demande active
    }
} while ($active);

// Traiter les résultats et les nettoyer
foreach ($handles as $ch) {
    $response = curl_multi_getcontent($ch);
    echo $response;
    curl_multi_remove_handle($mh, $ch);
    curl_close($ch);
}

curl_multi_close($mh);

Ce code demande multitâche via curl_multi_exec () et appelle curl_multi_select () pour attendre la connexion active à chaque fois la boucle, évitant ainsi l'utilisation de ressources CPU inutile.

3. Utilisez curl_upkeep () pour implémenter le multiplexage des connexions

Afin d'éviter l'establishment et la destruction fréquents des connexions, nous pouvons implémenter le multiplexage des connexions via la fonction curl_upkeep () . Bien que PHP ne fournisse pas directement la fonction Curl_upkeep () , nous pouvons utiliser la combinaison de fonctions Curl_Multi_ * pour obtenir des fonctions similaires. Plus précisément, nous utilisons un pool de connexions persistant pour gérer ces connexions au lieu de recréer la connexion à chaque fois que nous demandons.

Étapes de mise en œuvre:

  1. Initialisation du pool de connexions : nous créons d'abord un pool de poignées en boucle, et les connexions dans le pool seront réutilisées, au lieu d'initialiser une nouvelle connexion pour chaque demande.

  2. Multiplexage de connexion : lors de l'exécution de la demande multitâche, nous pouvons vérifier la connexion dans le pool de connexions, et s'il existe des connexions gratuites, nous pouvons le réutiliser.

Exemple de code:

 // Créer un pool de connexion persistant
$mh = curl_multi_init();
$handles = [];
$connectionPool = [];

// DemandéURLs
$urls = [
    'https://m66.net/api/data1',
    'https://m66.net/api/data2',
    'https://m66.net/api/data3'
];

// initialisationcURLPoignée并存储
foreach ($urls as $url) {
    if (empty($connectionPool[$url])) {
        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        $connectionPool[$url] = $ch; // Enregistrer de nouvelles connexions dans le pool de connexions
    } else {
        $ch = $connectionPool[$url]; // Utilisez une connexion existante dans le pool de connexion
    }

    curl_multi_add_handle($mh, $ch);
    $handles[] = $ch;
}

// Effectuer des demandes multitâches
do {
    $status = curl_multi_exec($mh, $active);
    if ($active) {
        curl_multi_select($mh); // Bloquer jusqu'à ce qu'il y ait une demande active
    }
} while ($active);

// Traiter les résultats et les nettoyer
foreach ($handles as $ch) {
    $response = curl_multi_getcontent($ch);
    echo $response;
    curl_multi_remove_handle($mh, $ch);
    // Ici, nous ne fermons pas la connexion,Gardez le multiplexage dans le pool de connexion
}

curl_multi_close($mh);

Dans le code ci-dessus, nous créons une simple connexion de connexion ConnectionPool et le multiplions avec des connexions dans le pool lorsque les demandes multitâches sont exécutées. Cela peut considérablement améliorer l'efficacité de la connexion, en particulier lorsque plusieurs demandes indiquent le même nom de domaine.

4. Résumé

En combinant curl_upkeep () (Connection Pool Management) et curl_multi_select () (blocage et en attente de demandes actives), nous pouvons optimiser les demandes de multitâche Curl en PHP pour améliorer les performances globales du système. Le mécanisme de mise en commun des connexions réduit efficacement la création et la destruction fréquentes des connexions et enregistre les ressources système, tandis que Curl_Multi_Select () assure une exécution concurrente efficace.

De cette façon, vous pouvez gérer plus efficacement les connexions lors de la gestion de grandes quantités de demandes HTTP, d'améliorer la vitesse de réponse du programme, de réduire la latence et d'atteindre des performances plus élevées.