Position actuelle: Accueil> Derniers articles> Comment utiliser CURL_MULTI_INFO_READ pour implémenter un traitement de demande simultané similaire à Promise.all en javascript?

Comment utiliser CURL_MULTI_INFO_READ pour implémenter un traitement de demande simultané similaire à Promise.all en javascript?

M66 2025-06-15

Dans le développement frontal moderne, la promesse de JavaScript. Tout est un outil puissant pour gérer l'exécution simultanée de plusieurs demandes asynchrones. Il permet de lancer plusieurs demandes en même temps, en attendant que toutes les demandes soient remplies avant d'exécuter une logique ultérieure. En tant que langue côté serveur, bien que PHP n'ait pas de mécanisme de promesse direct, nous pouvons également implémenter un traitement de demande simultanée similaire via les fonctions Curl_Multi Series. Cet article se concentre sur l'explication de la façon d'utiliser CURL_MULTI_INFO_READ pour implémenter un traitement de demande simultané similaire à Promise.all .


Pourquoi utiliser curl_multi?

Le curl_exec ordinaire est synchrone, ce qui signifie que chaque demande doit attendre que le résultat revienne avant de continuer à exécuter l'étape suivante. S'il y a plusieurs demandes à envoyer, l'efficacité d'exécution séquentielle est très inefficace. CURL_MULTI nous permet d'initier plusieurs demandes en même temps, puis de les traiter simultanément pour améliorer les performances.


Idées de base

  1. Créez plusieurs poignées de curl indépendantes ( curl_init ).

  2. Ajoutez ces poignées à une poignée curl_multi .

  3. Utilisez la boucle curl_multi_exec pour exécuter toutes les demandes.

  4. Obtenez les informations de demande terminées via curl_multi_info_read .

  5. Fermez la poignée terminée et enregistrez le résultat.

  6. Attendez que toutes les demandes soient complétées, similaires à la promesse. Tous attendez que toutes les promesses se terminent.


Exemple de code

L'exemple de code suivant montre comment demander simultanément plusieurs URL et les traiter uniformément une fois toutes les demandes terminées. Les domaines URL de l'exemple sont remplacés par m66.net .

 <?php
// DemanderURLListe
$urls = [
    'https://m66.net/api/user',
    'https://m66.net/api/order',
    'https://m66.net/api/product',
];

// initialisation curl_multi Poignée
$mh = curl_multi_init();
$handles = [];

// initialisation所有demanderPoignée并加入 multi Poignée
foreach ($urls as $key => $url) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    // Définir le délai d&#39;attente et d&#39;autres options pour s&#39;ajuster en fonction de vos besoins
    curl_multi_add_handle($mh, $ch);
    $handles[$key] = $ch;
}

// Effectuez toutes les demandes
$running = null;
do {
    curl_multi_exec($mh, $running);
    // En attente d&#39;une connexion active,Réduire efficacementCPUTaux d&#39;utilisation
    curl_multi_select($mh);
    
    // Lire la demande terminée
    while ($info = curl_multi_info_read($mh)) {
        if ($info['msg'] == CURLMSG_DONE) {
            // 找出Finitiondemander的Poignée
            $finishedHandle = $info['handle'];
            // Trouvez celui correspondant key
            $key = array_search($finishedHandle, $handles, true);
            
            // Obtenez du contenu et des codes d&#39;état
            $content = curl_multi_getcontent($finishedHandle);
            $httpCode = curl_getinfo($finishedHandle, CURLINFO_HTTP_CODE);
            
            echo "demander {$urls[$key]} Finition,HTTPCode d&#39;état: {$httpCode}\n";
            echo "Durée du contenu: " . strlen($content) . " octet\n\n";
            
            // 关闭并移除已经Finition的Poignée
            curl_multi_remove_handle($mh, $finishedHandle);
            curl_close($finishedHandle);
            
            // 将对应Poignée置空,Jugement ultérieur pratique
            unset($handles[$key]);
        }
    }
} while ($running > 0);

curl_multi_close($mh);

echo "所有demander均已Finition。\n";

Analyse de code

  • curl_multi_init () crée une poignée pour le traitement multi-request.

  • Chaque curl_init () crée une demande distincte et après la configuration, ajoute une poignée multi-request.

  • Démarrez la demande via curl_multi_exec () et boucle pour appeler jusqu'à ce que toutes les demandes soient terminées.

  • Utilisez curl_multi_select () pour éviter une utilisation excessive du processeur.

  • curl_multi_info_read () renvoie les informations de demande terminées, similaires au rappel de promesse alors .

  • Une fois la demande terminée, fermez et supprimez la poignée correspondante à temps pour éviter de gaspiller les ressources.

  • Grâce au processus ci-dessus, toutes les demandes sont simultanées et traitées uniformément après l'achèvement, avec l'effet similaire à Promise . tout.


Résumer

Bien que PHP n'ait pas de mécanisme de promesse natif, il peut entièrement implémenter la gestion et le traitement des résultats des demandes simultanées à l'aide des fonctions Curl_Multi Series, en particulier Curl_Multi_info_Read . Avec cette méthode, l'efficacité des scripts PHP lors de l'exécution d'appels multi-interface peut être considérablement améliorée, et est particulièrement adapté aux scénarios où plusieurs interfaces externes sont appelées en même temps.

J'espère que cet exemple vous aidera à comprendre les demandes simultanées PHP!