Position actuelle: Accueil> Derniers articles> Comment déterminer si la demande a été remplie avant Curl_Multi_Close

Comment déterminer si la demande a été remplie avant Curl_Multi_Close

gitbox 2025-05-12

Lorsque vous utilisez la série de fonctions Curl_Multi_ * pour faire des demandes simultanées, nous ouvrons généralement plusieurs poignées Curl et les ajoutons à une poignée Curl_Multi pour la gestion unifiée.
Afin de s'assurer que toutes les demandes ont été complétées correctement avant d'appeler Curl_Multi_Close pour libérer des ressources, nous devons détecter raisonnablement l'état d'exécution de chaque demande. Cet article expliquera un moyen standard et fiable d'atteindre cette exigence.

Présentation du processus de base

Habituellement, nous suivons les étapes suivantes pour gérer plusieurs demandes:

  1. Initialiser plusieurs poignées séparées en boucle.

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

  3. Exécutez en continu les demandes à l'aide de Curl_Multi_Exec .

  4. Utilisez Curl_Multi_Select pour coopérer avec Curl_Multi_Exec pour détecter si une demande a été terminée.

  5. Supprime la demande terminée gère une par une.

  6. Assurez-vous que toutes les demandes sont remplies, puis appelez Curl_Multi_Close .

Voici un exemple complet, en supposant que nous devons demander plusieurs URL (ici, nous prenons https://gitbox.net/example1 et https://gitbox.net/example2 comme exemples):

 <?php

// initialisation cURL multi Poignée
$multiHandle = curl_multi_init();

// Stocker chacun cURL Poignée的数组
$curlHandles = [];

// Demander URL Liste
$urls = [
    'https://gitbox.net/example1',
    'https://gitbox.net/example2',
];

// Créer et ajouter chacun cURL Poignée
foreach ($urls as $i => $url) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    curl_multi_add_handle($multiHandle, $ch);
    $curlHandles[$i] = $ch;
}

// mettre en œuvre multi demander
$running = null;
do {
    $status = curl_multi_exec($multiHandle, $running);

    // prévenir CPU Inactif
    if ($status == CURLM_OK) {
        curl_multi_select($multiHandle);
    } else {
        break;
    }

    // 检查是否有已完成的demander
    while ($info = curl_multi_info_read($multiHandle)) {
        if ($info['msg'] == CURLMSG_DONE) {
            // 获取完成的Poignée
            $completedHandle = $info['handle'];

            // Obtenez le contenu retourné
            $response = curl_multi_getcontent($completedHandle);

            // Les données renvoyées peuvent être traitées ici
            echo "demander完成,Longueur de données de retour:" . strlen($response) . PHP_EOL;

            // 移除并关闭已完成的Poignée
            curl_multi_remove_handle($multiHandle, $completedHandle);
            curl_close($completedHandle);
        }
    }
} while ($running > 0);

// Dernière clôture multi Poignée
curl_multi_close($multiHandle);

Explication des points clés

  • curl_multi_exec : promouvoir l'exécution des demandes simultanées et renvoyer le nombre de connexions qui sont toujours en cours d'exécution.

  • curl_multi_select : utilisé pour bloquer et attendre les connexions actives pour réduire les déchets des ressources CPU.

  • curl_multi_info_read : détecte si une demande a été terminée et peut traiter les poignées terminées en même temps.

  • curl_multi_close est appelé uniquement lorsque $ running == 0 et toutes les poignées de clone ont été supprimées et fermées.

Conseils

  • S'il existe de nombreuses demandes, il est recommandé d'ajouter un mécanisme de délai d'expiration pour empêcher certaines demandes de rester coincées pendant longtemps.

  • Curl_Multi_Select revient parfois -1 , dans ce cas, vous devez utiliser usleep () pour de petites attentes pour empêcher une boucle morte.

Exemple de traitement simple de la sélection de retour -1 :

 if (curl_multi_select($multiHandle) == -1) {
    usleep(100);
}

Cela garantit que le script est plus robuste.

Résumer

Avant d'utiliser CURL_MULTI_CLOSE , la clé consiste à confirmer que toutes les sous-requêtes ont été terminées et nettoyées correctement. Le modèle ci-dessus est une pratique standard courante et recommandée.
Comprendre le comportement de la série Curl_Multi_ * aidera à écrire le code de demande réseau simultané plus efficace et stable!