Position actuelle: Accueil> Derniers articles> Comment gérer Curl_Multi_Close et toujours obtenir le résultat de retour

Comment gérer Curl_Multi_Close et toujours obtenir le résultat de retour

gitbox 2025-05-29

Dans PHP, la fonction Curl_Multi_ * est utilisée pour initier plusieurs demandes Curl en même temps pour améliorer l'efficacité de la demande. Cependant, lorsque vous appelez CURL_MULTI_CLOSE pour mettre fin à une session Curl multiple, vous ne pouvez plus obtenir le résultat de retour de la demande car la fonction ferme toutes les poignées connexes. Pour obtenir le résultat de retour de chaque demande après avoir appelé CURL_MULTI_CLOSE , certaines astuces sont nécessaires.

Dans cet article, nous expliquerons comment obtenir correctement le résultat de retour de toutes les demandes après curl_multi_close .

Utilisez Curl_Multi_getContent pour obtenir le résultat de retour

Après avoir appelé CURL_MULTI_CLOSE , le contenu de réponse de chaque demande Curl peut être obtenu via Curl_Multi_getContent . Afin d'obtenir correctement tous les résultats retournés, il est nécessaire de s'assurer que les résultats de chaque demande sont conservés avant de fermer la session Curl.

Voici un exemple complet:

 <?php
// initialisationcURLPoignée
$urls = [
    'https://gitbox.net/api/endpoint1',
    'https://gitbox.net/api/endpoint2',
    'https://gitbox.net/api/endpoint3'
];

$multiCurl = curl_multi_init();
$curlHandles = [];

// Pour chacunURLcréercURLPoignée并添加到多重请求队列
foreach ($urls as $url) {
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // Obtenez le contenu retourné
    curl_multi_add_handle($multiCurl, $ch);
    $curlHandles[] = $ch;
}

// Effectuez toutes les demandes
$running = null;
do {
    curl_multi_exec($multiCurl, $running);
    curl_multi_select($multiCurl);
} while ($running > 0);

// Obtenez le résultat de chaque demande
$responses = [];
foreach ($curlHandles as $ch) {
    $responses[] = curl_multi_getcontent($ch);
    curl_multi_remove_handle($multiCurl, $ch); // 从多重请求队列中移除Poignée
}

// fermeturecURLConversations multiples
curl_multi_close($multiCurl);

// Sortir le résultat de retour pour chaque demande
foreach ($responses as $response) {
    echo $response . "\n";
}
?>

Analyse de code

  1. Initialiser plusieurs poignées de demande :

    • Nous définissons d'abord un tableau d' URL $ , qui stocke toutes les URL à demander. Dans cet exemple, toutes les URL sont remplacées par des noms de domaine gitbox.net .

    • Nous créons ensuite une poignée Curl $ CH pour chaque URL et l'ajoutons à la session Curl multiple.

  2. Exécuter la demande :

    • Utilisez curl_multi_exec () pour exécuter toutes les demandes ajoutées à la session. Nous utilisons Curl_Multi_Select () pour nous assurer que nous ne sommes pas inactives tant que la demande n'est pas terminée.

  3. Obtenez le résultat de la demande :

    • Une fois toutes les demandes terminées, nous utilisons Curl_Multi_getContent ($ ch) pour obtenir le contenu de retour de chaque demande et le stocker dans le tableau $ RESES .

  4. Nettoyer :

    • Nous utilisons CURL_MULTI_REMOVE_HANDLE ($ MULTICURL, $ CH) pour supprimer chaque poignée Curl des plusieurs sessions et appeler CURL_MULTI_CLOSE () pour fermer toute la session Curl.

  5. Contenu de réponse de sortie :

    • Enfin, itérez sur le tableau $ RESES et sortit le contenu de réponse de chaque demande.

Choses à noter

  • Traitement asynchrone : L'un des plus grands avantages de la fonction Curl_Multi_ * est qu'il peut envoyer plusieurs demandes en même temps, ce qui est particulièrement utile pour les demandes simultanées. Même dans le scénario multi-request, Curl_Multi_getContent peut obtenir correctement le résultat de retour de chaque demande.

  • Traitement du délai d'expiration de la demande : Dans les scénarios réels, vous devrez peut-être également définir une option de délai d'expiration pour chaque demande, telle que curlopt_timeout , pour éviter une demande bloquant d'autres demandes en raison de la réponse lente du serveur.

  • Gestion des erreurs : Lorsque vous utilisez Curl, n'oubliez pas de vérifier si la demande est réussie et utilisez Curl_errno ($ ch) pour obtenir le code d'erreur pour vous aider à identifier le problème dans la demande.