Position actuelle: Accueil> Derniers articles> Comment terminer correctement les demandes de longue date avec Curl_Multi_Close

Comment terminer correctement les demandes de longue date avec Curl_Multi_Close

gitbox 2025-05-12

En PHP, la série de fonctions Curl_Multi_ * offre un moyen puissant d'initier plusieurs demandes HTTP en même temps, améliorant ainsi les performances de concurrence du programme. Parmi eux, Curl_Multi_Close () est une fonction utilisée pour nettoyer les ressources. Il s'appelle une fois toutes les demandes simultanées remplies et constitue une étape importante dans la publication des ressources sous-jacentes. Cependant, s'ils sont mal utilisés, il peut provoquer des fuites de mémoire ou la demande n'est pas complètement terminée.

Cet article utilisera des exemples de code réels pour expliquer comment utiliser correctement Curl_Multi_Close () pour mettre fin aux demandes de longue durée.

1. Qu'est-ce que curl_multi_close?

curl_multi_close () est la fonction finale appariée par curl_multi_init () . Son objectif est de fermer une ressource multipliée et de libérer toutes les ressources qui lui sont associées. Notez qu'il ne ferme pas automatiquement chaque poignée de boucle individuelle ajoutée à cette poignée multiple, nous devons donc le gérer manuellement.

2. Un exemple de base de demandes simultanées

Voici un processus standard pour exécuter plusieurs demandes HTTP à l'aide de la série de fonctions Curl_Multi_ * et de fermeture correcte:

 <?php

// Créer le demandé URL Tableau
$urls = [
    'https://gitbox.net/api/endpoint1',
    'https://gitbox.net/api/endpoint2',
    'https://gitbox.net/api/endpoint3',
];

// initialisation multi handle
$multiHandle = curl_multi_init();
$curlHandles = [];

// Pour chacun URL initialisation单独的 curl handle et ajouter à multi handle milieu
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;
}

// Effectuez toutes les demandes
$running = null;
do {
    $status = curl_multi_exec($multiHandle, $running);
    if ($running) {
        curl_multi_select($multiHandle); // éviter CPU Occupation trop élevée
    }
} while ($running && $status == CURLM_OK);

// Traiter les résultats et fermer chacun curl handle
foreach ($curlHandles as $ch) {
    $response = curl_multi_getcontent($ch);
    $info = curl_getinfo($ch);
    echo "Code d&#39;état de demande: " . $info['http_code'] . "\n";
    echo "Contenu de réponse: " . substr($response, 0, 100) . "...\n"; // Afficher seulement du contenu
    curl_multi_remove_handle($multiHandle, $ch);
    curl_close($ch);
}

// Dernière clôture multi handle
curl_multi_close($multiHandle);

3. Erreurs et solutions courantes

  1. Erreur: fermer la manche multiple sans retirer la poignée

     // Mauvaise utilisation
    curl_close($ch);  // Fermer d&#39;abord curl handle
    curl_multi_close($mh);
    

    L'ordre correct doit être:

     curl_multi_remove_handle($mh, $ch);
    curl_close($ch);
    curl_multi_close($mh);
    
  2. Erreur: n'attendez pas que toutes les demandes terminent

    Certains développeurs sauteront Curl_Multi_Select () directement ou le fermeront directement après Curl_Multi_EXEC () une fois, ce qui entraîne des demandes. L'utilisation d'une boucle à banc à faire est un moyen fiable de s'assurer que toutes les demandes sont remplies.

4. Que devrait-il être fait lorsque la demande prend beaucoup de temps?

Pour les demandes de longue durée (comme le téléchargement de fichiers volumineux ou de calculs à distance), les méthodes suivantes peuvent être contrôlées:

  • Définir un curlopt_timeout raisonnable

  • Utilisez curl_multi_select () pour réduire l'utilisation du processeur

  • Vérifiez et traitez l'état renvoyé par curl_multi_info_read ()

Exemple (ajout de contrôle de temps mort):

 curl_setopt($ch, CURLOPT_TIMEOUT, 30); // Définissez le temps d&#39;exécution maximum sur30Deuxième

5. Résumé

curl_multi_close () lui-même n'est pas compliqué, mais il doit être utilisé avec curl_multi_remove_handle () et curl_close () pour s'assurer que la ressource est complètement publiée. Dans les scénarios de demande de concurrence élevés, la fermeture de Curl gère statu que la clé pour éviter les fuites des ressources et améliorer la stabilité du programme.

Lorsque vous utilisez des demandes de réseau multithread, gardez à l'esprit l'ordre suivant:

  1. Ajouter une seule poignée à une poignée multiple

  2. Exécuter plusieurs manches

  3. Obtenir des résultats

  4. Retirer et fermer une seule poignée

  5. Fermer enfin la manche multiple

Grâce à la méthode ci-dessus, vous pouvez utiliser efficacement les fonctions Curl_Multi_ * et terminer correctement toutes les connexions pour améliorer l'efficacité de maintenabilité et de fonctionnement de votre code.