Position actuelle: Accueil> Derniers articles> Comment fermer élégamment toutes les séances de boucle après la fin des demandes simultanées

Comment fermer élégamment toutes les séances de boucle après la fin des demandes simultanées

gitbox 2025-05-12

Lors de la réalisation d'un grand nombre de demandes HTTP simultanées, la série de fonctions Curl_Multi_ * fournies par PHP est un outil très pratique qui vous permet de lancer plusieurs demandes en même temps dans un script, améliorant ainsi l'efficacité d'exécution. Parmi eux, curl_multi_close () est la dernière étape de tout le processus. Il est responsable du nettoyage des ressources initialisées par curl_multi_init () , garantissant que toutes les poignées Curl sont correctement fermées, ne laissant aucun dangers caché de la fuite des ressources. Cet article utilisera un exemple complet pour expliquer en détail comment fermer gracieusement toutes les sessions de boucle une fois toutes les demandes simultanées terminées.

1. Examen des concepts de base

Lorsque vous utilisez CURL_MULTI_ * pour les demandes simultanées, le processus général est le suivant:

  1. Initialisez un conteneur Curl_Multi .

  2. Créez plusieurs demandes Curl et ajoutez-les au conteneur Curl_Multi .

  3. Utilisez CURL_MULTI_EXEC pour piloter l'exécution de toutes les demandes.

  4. La boucle vérifie si la demande est terminée.

  5. Traitez séparément les résultats de chaque demande de boucle .

  6. Supprime chaque poignée de boucle individuelle.

  7. Utilisez curl_multi_close () pour libérer la ressource.

2. Exemple d'explication de code

Voici un exemple qui montre comment demander plusieurs URL simultanément et fermer les ressources gracieusement une fois toutes les demandes terminées:

 <?php

// Pour envoyer des demandes simultanées URL Liste
$urls = [
    "https://gitbox.net/api/data1",
    "https://gitbox.net/api/data2",
    "https://gitbox.net/api/data3"
];

// initialisation curl_multi Poignée
$multiHandle = curl_multi_init();
$curlHandles = [];

// Pour chacun URL Créer un séparé curl Poignée,Et rejoindre multi Poignée
foreach ($urls as $url) {
    $ch = curl_init();
    curl_setopt_array($ch, [
        CURLOPT_URL => $url,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_TIMEOUT => 10
    ]);
    curl_multi_add_handle($multiHandle, $ch);
    $curlHandles[] = $ch;
}

// Effectuez toutes les demandes
$active = null;
do {
    $mrc = curl_multi_exec($multiHandle, $active);
    // curl_multi_select Bloquer jusqu&#39;à ce qu&#39;il y ait une connexion active
    if ($active) {
        curl_multi_select($multiHandle);
    }
} while ($active && $mrc == CURLM_OK);

// Obtenez le résultat de chaque demande
foreach ($curlHandles as $ch) {
    $response = curl_multi_getcontent($ch);
    $info = curl_getinfo($ch);
    $error = curl_error($ch);

    echo "URL: " . $info['url'] . PHP_EOL;
    echo "HTTP Code: " . $info['http_code'] . PHP_EOL;
    echo "Response: " . $response . PHP_EOL;
    echo "Error: " . $error . PHP_EOL;
    echo str_repeat("-", 40) . PHP_EOL;

    // 移除并fermeturePoignée
    curl_multi_remove_handle($multiHandle, $ch);
    curl_close($ch);
}

// enfin,fermeture multi Poignée
curl_multi_close($multiHandle);

?>

3. Choses à noter sur curl_multi_close

  • Appelez uniquement après que toutes les poignées sont supprimées : avant d'appeler Curl_Multi_Close () , vous devez d'abord supprimer toutes les poignées de clone du multi-conteneur via Curl_Multi_Remove_Handle () , puis appelez curl_close () un par un. Sinon, les ressources ne peuvent pas être libérées ou incertaines comportementales.

  • La poignée de clone ne sera pas fermée automatiquement : curl_multi_close () ne fera que le multi-conteneur lui-même et ne fermera pas automatiquement la poignée de boucle interne. Vous devez fermer manuellement chaque poignée créée par curl_init () .

  • Temps d'appel : curl_multi_close () devrait être la dernière étape que vous exécutez dans tout le processus. Son appel marque la fin officielle de tout le cycle de vie de demande simultanée.

4. Résumé

En utilisant curl_multi_init () et curl_multi_close () correctement, vous pouvez faire efficacement des demandes de réseau simultanées dans PHP, tout en vous garantissant que les ressources sont correctement libérées après utilisation, en évitant les fuites de mémoire ou les exceptions de connexion. Assurez-vous de vous souvenir: chaque curl_init () correspond à un curl_close () , et chaque curl_multi_init () correspond à un curl_multi_close () , afin que votre code puisse être plus robuste et fiable.