Position actuelle: Accueil> Derniers articles> Comment gérer et traiter efficacement les données de retour de plusieurs demandes de curl dans curl_multi_info_read?

Comment gérer et traiter efficacement les données de retour de plusieurs demandes de curl dans curl_multi_info_read?

gitbox 2025-06-19

Dans PHP, la fonction Curl_Multi_ * fournit un moyen efficace d'envoyer simultanément plusieurs demandes HTTP. En particulier, la fonction curl_multi_info_read , qui nous aide à gérer et à traiter leurs données de retour lors de l'initiation de plusieurs demandes Curl. Cet article explorera en détail comment gérer et traiter pleinement les données de retour de plusieurs demandes Curl lors de l'utilisation de Curl_Multi_info_Read pour assurer l'efficacité et la précision.

1. Introduction du fond

En PHP, l'extension Curl fournit des API riches pour les demandes HTTP. Lorsque vous devez lancer plusieurs demandes HTTP, la fonction Curl_Multi_ * est généralement utilisée pour exécuter ces demandes en parallèle. CURL_MULTI_EXEC est utilisé pour exécuter plusieurs demandes, tandis que Curl_Multi_info_Read est utilisé pour obtenir des informations d'exécution de chaque demande et de ses données de retour.

2. Comment utiliser Curl_Multi_ * Fonction?

Tout d'abord, initialisez une poignée multi-curl avec curl_multi_init () , puis créez une poignée de curl séparée pour chaque demande et ajoutez-les à la poignée multi-curl. Voici un exemple simple:

 <?php
// Initialiser plus d&#39;un cURL Poignée
$multiCurl = curl_multi_init();

// Créer plusieurs séparateurs cURL demanderPoignée
$curlHandles = [];
$urls = ['https://gitbox.net/api/data1', 'https://gitbox.net/api/data2', 'https://gitbox.net/api/data3'];

foreach ($urls as $url) {
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_multi_add_handle($multiCurl, $ch);
    $curlHandles[] = $ch;
}

// Exécuter une demande
do {
    $status = curl_multi_exec($multiCurl, $active);
    if ($active) {
        // Attendez que l&#39;événement soit terminé
        curl_multi_select($multiCurl);
    }
} while ($active && $status == CURLM_OK);

// Traiter les résultats de chaque demande
foreach ($curlHandles as $ch) {
    $response = curl_multi_getcontent($ch);
    // Traitement des données de retour
    echo $response . PHP_EOL;
    // 关闭Poignée
    curl_multi_remove_handle($multiCurl, $ch);
    curl_close($ch);
}

// Fermer beaucoup cURL Poignée
curl_multi_close($multiCurl);
?>

Dans le code ci-dessus, nous ajoutons chaque poignée de demande Curl à la poignée Multi Curl $ multicurl via Curl_Multi_Add_Handle , puis exécutons ces demandes simultanément via Curl_Multi_Exec .

3. Utilisez curl_multi_info_read pour obtenir l'état de la demande

La fonction curl_multi_info_read est utilisée pour obtenir les informations de retour pour chaque demande d'une poignée multi-curl. Grâce à cette fonction, nous pouvons obtenir l'état d'exécution de la demande, les informations d'erreur et le contenu de retour de la demande. Voici comment l'utiliser pour gérer et traiter les données renvoyées pour plusieurs demandes:

 <?php
// Supposons que beaucoup ont été initialisés et exécutés cURL demander(Voir ci-dessus)

// 获取每个demander的执行信息
while ($done = curl_multi_info_read($multiCurl)) {
    // 获取demander状态
    $status = $done['result'];
    $ch = $done['handle'];

    if ($status === CURLE_OK) {
        // demander成功
        $response = curl_multi_getcontent($ch);
        echo "demander成功,Retour des données: " . $response . PHP_EOL;
    } else {
        // demander失败
        echo "demander失败,message d&#39;erreur:" . curl_error($ch) . PHP_EOL;
    }

    // 移除已完成的Poignée
    curl_multi_remove_handle($multiCurl, $ch);
    curl_close($ch);
}

// Fermer beaucoup cURL Poignée
curl_multi_close($multiCurl);
?>

Dans cet exemple, nous utilisons Curl_Multi_info_read pour obtenir les informations de retour pour chaque demande. Si la demande réussit, nous obtiendrons les données renvoyées via Curl_Multi_getContent . Sinon, nous allons imprimer le message d'erreur.

4. Comment gérer les données de retour demandées?

Lorsque plusieurs demandes sont exécutées en parallèle, les données de retour de chaque demande peuvent avoir une structure ou un contenu différent. Par conséquent, lors du traitement des données retournées, nous devons considérer les aspects suivants:

  1. Unity of Data Formats : Assurez-vous que les données renvoyées par toutes les demandes sont cohérentes, ce qui facilite le traitement par la suite. Par exemple, vous pouvez envisager de convertir les données retournées au format JSON et de les analyser uniformément.

  2. Gestion des erreurs : Pour chaque demande, la défaillance de la demande doit être gérée. CURL_MULTI_INFO_READ peut obtenir les informations d'erreur demandées pour aider à déboguer et à analyser les problèmes.

  3. Traitement des données asynchrones : Dans certains cas, les données renvoyées doivent être traitées davantage de manière asynchrone, telles que les déposer dans la base de données ou passer d'autres appels API. Dans ce cas, le système de file d'attente peut être utilisé ou les données peuvent être stockées dans le cache et traitées plus tard.

Ce qui suit est un exemple combinant le traitement du format de données et le traitement des erreurs:

 <?php
// Supposons que plusieurs exécutions ont été effectuées cURL demander并获取了Retour des données

while ($done = curl_multi_info_read($multiCurl)) {
    $ch = $done['handle'];
    $status = $done['result'];

    // 检查demander是否成功
    if ($status === CURLE_OK) {
        $response = curl_multi_getcontent($ch);
        // Supposons que le retourné JSON données
        $data = json_decode($response, true);

        if ($data === null) {
            echo "Analyse JSON données失败:" . json_last_error_msg() . PHP_EOL;
        } else {
            // 处理données
            echo "成功获取données:" . print_r($data, true) . PHP_EOL;
        }
    } else {
        // demander失败,输出message d&#39;erreur
        echo "demander失败,message d&#39;erreur:" . curl_error($ch) . PHP_EOL;
    }

    // 移除并关闭Poignée
    curl_multi_remove_handle($multiCurl, $ch);
    curl_close($ch);
}

curl_multi_close($multiCurl);
?>

Dans ce code, nous analysons les données JSON renvoyées via JSON_DECODE et gérons l'erreur d'analyse.

5. Suggestions d'optimisation des performances

Bien que la fonction Curl_Multi_ * autorise déjà les demandes parallèles, dans un environnement de concurrence élevé, nous devons toujours considérer les mesures d'optimisation suivantes:

  • Demandes de lots : envoyez des demandes par lots au lieu d'envoyer toutes les demandes à la fois, en évitant les demandes simultanées excessives qui conduisent à l'épuisement des ressources ou à la dégradation des performances.

  • Paramètre de délai d'expiration de la demande : Définissez les limites de délai d'expiration appropriées pour empêcher une demande de bloquer et d'affecter l'exécution d'autres demandes. Utilisez curlopt_timeout ou curlopt_timeout_ms pour définir le délai d'attente de la demande.

  • Poolage de connexion : en utilisant le mécanisme de multiplexage des connexions de Curl, il réduit les frais généraux de l'établissement de connexions à plusieurs reprises. Vous pouvez optimiser le multiplexage de connexion en définissant Curlopt_forbid_reuse et Curlopt_fresh_connect .

6. Résumé

Avec Curl_Multi_info_read et Curl_Multi_ * , PHP peut gérer et traiter plusieurs demandes HTTP parallèles très efficacement. Dans les applications pratiques, nous devons non seulement nous concentrer sur l'exécution parallèle des demandes, mais également traiter efficacement les données retournées pour assurer la fiabilité et les performances du traitement.

J'espère que cet article vous aidera à mieux comprendre comment utiliser Curl_Multi_info_Read dans PHP pour gérer plusieurs demandes et traiter leurs données de retour.

  • Étiquettes associées:

    cURL