Position actuelle: Accueil> Derniers articles> Comment mettre en œuvre le contrôle du délai d'expiration des demandes dans curl_multi_close

Comment mettre en œuvre le contrôle du délai d'expiration des demandes dans curl_multi_close

gitbox 2025-05-12

Dans PHP, la série de fonctions Curl_Multi_ * vous permettent d'envoyer simultanément plusieurs demandes HTTP, améliorant considérablement l'efficacité d'exécution du programme. Cependant, lorsque de nombreuses personnes utilisent CURL_MULTI_CLOSE pour mettre fin aux séances multi-requêtes, elles ont tendance à ignorer un problème important:

Si le délai d'expiration n'est pas raisonnablement contrôlé, lorsqu'une demande ne répond pas longtemps, toute l'application peut être bloquée, ce qui entraîne une très mauvaise expérience utilisateur. Cet article utilisera des exemples pour vous apprendre à mettre en œuvre élégamment le contrôle du délai d'expiration lors de l'utilisation de Curl_Multi_Close .

Idées de base

En fait, Curl_Multi_Close n'est utilisé que pour fermer la poignée Curl_Multi , et il ne contrôle pas le délai d'attente lui-même. Le contrôle du délai d'attente réel doit se produire au stade de l'exécution de la demande (c'est-à-dire CURL_MULTI_EXEC et CURL_MULTI_SELECT ).

Autrement dit, le contrôle du délai d'expiration dépend de:

  • Réglez le délai d'attente sur une seule poignée de boucle

  • Enregistrer et juger le temps total de la boucle d'exécution

Exemple de code

Voici un exemple pratique. Supposons que nous ayons deux demandes, demandant https://gitbox.net/api/endpoint1 et https://gitbox.net/api/endpoint2 , nous espérons que toutes les demandes ne prendront pas plus de 10 secondes au total.

 <?php

// Créer deux cURL Poignée
$ch1 = curl_init('https://gitbox.net/api/endpoint1');
$ch2 = curl_init('https://gitbox.net/api/endpoint2');

// Définissez séparément un délai d&#39;expiration pour chaque demande(Facultatif)
curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch1, CURLOPT_TIMEOUT, 8); // La plupart des demandes par personne8Deuxième
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch2, CURLOPT_TIMEOUT, 8);

// Créer un cURL 批处理Poignée
$mh = curl_multi_init();

// 添加Poignée到批处理Poignée中
curl_multi_add_handle($mh, $ch1);
curl_multi_add_handle($mh, $ch2);

// Effectuer un traitement par lots
$startTime = microtime(true);
$timeout = 10; // Timeout total(Deuxième)

do {
    $status = curl_multi_exec($mh, $active);

    // S&#39;il y a toujours une connexion active
    if ($active) {
        // Bloquer et attendre
        $n = curl_multi_select($mh, 1.0);

        // si select retour -1,Évitez d&#39;attendre d&#39;attendre
        if ($n === -1) {
            usleep(100000); // dormir100毫Deuxième
        }
    }

    // Vérifiez si le temps mort
    if ((microtime(true) - $startTime) > $timeout) {
        echo "Le temps total pour demander dépasse{$timeout}Deuxième,Interruption forcée。\n";
        break;
    }
} while ($active && $status == CURLM_OK);

// Lire le résultat
$response1 = curl_multi_getcontent($ch1);
$response2 = curl_multi_getcontent($ch2);

// 关闭Poignée
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
curl_multi_close($mh);
curl_close($ch1);
curl_close($ch2);

// Résultats d&#39;impression
echo "Response 1: " . substr($response1, 0, 100) . "...\n";
echo "Response 2: " . substr($response2, 0, 100) . "...\n";
?>

Résumé des points clés

  1. Curlopt_timeout contrôle le délai d'attente d' une seule demande ;

  2. En enregistrant MicroTime (true) , le temps d'exécution total est contrôlé manuellement;

  3. Lorsque vous utilisez CURL_MULTI_SELECT , définissez une valeur de délai d'expiration appropriée (comme 1 seconde) pour éviter une utilisation excessive du processeur;

  4. CURL_MULTI_CLOSE n'est responsable que du nettoyage des ressources et ne contrôle aucune logique de délai d'attente .

Choses à noter

  • Si vous définissez un délai de sélection trop court (par exemple, 0,01 seconde), la charge du système peut augmenter.

  • Si Curl_Multi_Select renvoie -1, cela signifie qu'il n'y a pas de descripteur de fichier à attendre et nécessite un sommeil approprié ( Usleep ) pour éviter les boucles occupées.

  • Lorsqu'un délai d'expiration se produit, il est préférable d'annuler de manière proactive la demande inachevée pour éviter la fuite des ressources.