Position actuelle: Accueil> Derniers articles> Comment utiliser les fonctions Curl_Multi_ * Series pour réaliser des demandes simultanées à haute performance

Comment utiliser les fonctions Curl_Multi_ * Series pour réaliser des demandes simultanées à haute performance

M66 2025-06-02

En PHP, nous devons souvent faire des demandes de réseau avec des API, des sites Web ou des services externes. Bien que la demande unique Curl_exec () soit simple, dans des scénarios de concurrence élevés, son goulot d'étranglement des performances est très évident: chaque demande est exécutée séquentiellement, en attendant que la demande précédente se termine avant la suivante, ce qui entraîne une augmentation linéaire dans le temps global.

Pour améliorer l'efficacité de la demande de réseau, PHP fournit deux outils très puissants: Curl_share_Init () et Curl_Multi_ * Series Fonctions. Cet article fournira un aperçu approfondi de la façon de les utiliser pour réaliser des demandes simultanées haute performance.

1 ?? Le rôle de curl_share_init ()

curl_share_init () est utilisé pour partager des données entre plusieurs poignées Curl, telles que le cache DNS, les cookies, les sessions SSL, etc.

Par exemple: si vous devez demander plusieurs adresses du même nom de domaine en même temps, l'activation du cache DNS partagé peut réduire considérablement le temps de requête DNS.

 $sh = curl_share_init();
curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_DNS);

Ce code initialise une poignée partagée et est défini pour partager les données DNS. Ensuite, nous lierons cette poignée partagée à chaque demande de boucle .

2 ?? Curl_Multi_ * Fonction des fonctions série

La série de fonctions Curl_Multi_ * nous permet de lancer plusieurs demandes HTTP en même temps, plutôt que de les envoyer une par une comme curl_exec () .

Les fonctions principales incluent:

3 ?? Exemple pratique: demandes simultanées pour plusieurs URL

Voici un exemple complet montrant comment utiliser Curl_share_Init () et les fonctions Curl_Multi_ * Series pour demander simultanément plusieurs adresses.

 <?php

// Demander URL Liste
$urls = [
    'https://m66.net/api/endpoint1',
    'https://m66.net/api/endpoint2',
    'https://m66.net/api/endpoint3'
];

// Initialiser la poignée partagée
$sh = curl_share_init();
curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_DNS);

// initialisation multi Poignée
$mh = curl_multi_init();
$curl_handles = [];

// Pour chacun URL Créer un séparé curl Poignée
foreach ($urls as $i => $url) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_SHARE, $sh); // 绑定共享Poignée
    curl_multi_add_handle($mh, $ch);
    $curl_handles[$i] = $ch;
}

// Effectuez toutes les demandes
$running = null;
do {
    $status = curl_multi_exec($mh, $running);
    if ($status > 0) {
        echo "cURL error: " . curl_multi_strerror($status) . "\n";
    }
    // En attente d&#39;une connexion active
    curl_multi_select($mh);
} while ($running > 0);

// Obtenir des résultats
$responses = [];
foreach ($curl_handles as $i => $ch) {
    $responses[$i] = curl_multi_getcontent($ch);
    curl_multi_remove_handle($mh, $ch);
    curl_close($ch);
}

// fermeture multi et share Poignée
curl_multi_close($mh);
curl_share_close($sh);

// Résultat de sortie
foreach ($responses as $i => $response) {
    echo "Response from URL $i:\n$response\n\n";
}
?>

4 ?? Analyse de l'amélioration des performances

Avec Curl_Multi_ * , toutes les demandes seront exécutées autant que possible, et le temps global est proche de la demande unique la plus longue, plutôt que la somme.

L'utilisation de curl_share_init () peut réduire les frais généraux des requêtes DNS en double, des poignées de main SSL, etc., et optimiser davantage les performances.

Dans les scénarios où des demandes de concurrence et fréquentes élevées pour la même API de nom de domaine (comme ramper plusieurs interfaces en même temps, ramper les pages Web en lots, synchroniser plusieurs données de microservice, etc.), cette combinaison peut améliorer considérablement l'efficacité.

5 ?? Notes

  • Le partage DNS ne s'accélère pas toujours considérablement : il prend principalement en vigueur le même nom de domaine et plusieurs demandes.

  • Délai raisonnable : une demande coincée en simultanément peut affecter la situation globale.

  • Le contrôle du nombre de concurrence : trop de demandes peuvent entraîner l'épuisement du serveur ou des ressources locales et peuvent être distribués en sémaphores ou lots.

  • Gestion des erreurs : dans l'exemple, la demande unique n'a pas été traitée en détail et l'application réelle doit être complétée.