Position actuelle: Accueil> Derniers articles> Comment s'assurer que Curl_Multi_Close n'interfère pas avec le processus intermédiaire des demandes

Comment s'assurer que Curl_Multi_Close n'interfère pas avec le processus intermédiaire des demandes

gitbox 2025-05-29

Lorsque vous utilisez des extensions CURL dans PHP, la fonction Curl_Multi_ * est généralement utilisée pour gérer plusieurs demandes simultanées. Ces fonctions peuvent considérablement améliorer les performances de votre programme, en particulier lorsque plusieurs demandes HTTP sont envoyées simultanément. Cependant, lors de l'utilisation de la fonction Curl_Multi_Close , certains développeurs peuvent rencontrer des problèmes d'interférence dans le traitement des demandes, ce qui a permis de ne pas être terminé correctement ou de renvoyer une erreur.

Cet article explorera comment éviter les interférences dans le traitement des demandes et partager certains exemples et solutions de code pratiques.

1. Présentation de la fonction Curl_Multi_ *

PHP fournit la fonction Curl_Multi_ * pour effectuer plusieurs demandes Curl simultanées. Les fonctions principales sont:

Exemple de code

 <?php

$multiHandle = curl_multi_init();

$urls = [
    'https://gitbox.net/api/endpoint1',
    'https://gitbox.net/api/endpoint2',
    'https://gitbox.net/api/endpoint3'
];

$handles = [];

// Initialiser plusieurs poignées de demande
foreach ($urls as $url) {
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_multi_add_handle($multiHandle, $ch);
    $handles[] = $ch;
}

// Exécuter une demande
$running = null;
do {
    curl_multi_exec($multiHandle, $running);
} while ($running);

// Obtenir des données de réponse
foreach ($handles as $ch) {
    $response = curl_multi_getcontent($ch);
    echo $response . "\n";
    curl_multi_remove_handle($multiHandle, $ch);
}

// Fermez la poignée
curl_multi_close($multiHandle);

?>

2. CURL_MULTI_CLOSE

Bien que la fonction curl_multi_close soit une fonction de nettoyage pratique, elle peut parfois interférer au dernier stade du traitement de la demande, en particulier lorsque Curl_Multi_Close est appelé lorsque la demande n'est pas terminée. Cette ingérence peut entraîner la fin de certaines demandes ou la réponse reçue est incomplète.

Causes communes d'interférence

  1. Le délai d'achèvement des demandes simultanées est incohérente : en raison des différents temps de réponse des différentes demandes, certaines demandes peuvent ne pas avoir été remplies lorsque Curl_Multi_Close est appelée, ce qui entraîne la clôture de la demande à l'avance.

  2. Problèmes de libération des ressources : dans certains cas, appeler CURL_MULTI_CLOSE avant que la ressource ne soit complètement libérée peut affecter d'autres demandes ou entraîner la déconnexion de la connexion.

3. Comment éviter les interférences?

Afin d'éviter les interférences dans le traitement de la demande de la fonction Curl_Multi_Close , les stratégies suivantes peuvent être adoptées:

3.1 Assurez-vous que toutes les demandes sont remplies

Assurez-vous que toutes les demandes sont remplies avant d'appeler Curl_Multi_Close . Vous pouvez confirmer si toutes les demandes ont été remplies en vérifiant l'état d'exécution renvoyé par Curl_Multi_Exec . curl_multi_close ne doit être appelé que lorsque toutes les demandes sont traitées.

Exemple de code amélioré:

 <?php

$multiHandle = curl_multi_init();

$urls = [
    'https://gitbox.net/api/endpoint1',
    'https://gitbox.net/api/endpoint2',
    'https://gitbox.net/api/endpoint3'
];

$handles = [];

// Initialiser plusieurs poignées de demande
foreach ($urls as $url) {
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_multi_add_handle($multiHandle, $ch);
    $handles[] = $ch;
}

// Exécuter une demande
$running = null;
do {
    $mrc = curl_multi_exec($multiHandle, $running);
    if ($mrc > 0) {
        echo "CURL exec error: " . curl_multi_strerror($mrc);
    }
} while ($running);

// Obtenir des données de réponse
foreach ($handles as $ch) {
    $response = curl_multi_getcontent($ch);
    echo $response . "\n";
    curl_multi_remove_handle($multiHandle, $ch);
}

// Fermez la poignée
curl_multi_close($multiHandle);

?>

3.2 Utilisez Curl_Multi_Select pour améliorer les performances

Dans certains cas, Curl_Multi_Select () peut être utilisé pour optimiser les performances du traitement de la demande. Au lieu de sonder constamment Curl_Multi_EXEC , il peut bloquer les processus en attendant que la demande de curl soit terminée, ce qui réduit l'utilisation du processeur et assure un traitement en douceur des demandes.

Exemple de code:

 <?php

$multiHandle = curl_multi_init();

$urls = [
    'https://gitbox.net/api/endpoint1',
    'https://gitbox.net/api/endpoint2',
    'https://gitbox.net/api/endpoint3'
];

$handles = [];

// Initialiser plusieurs poignées de demande
foreach ($urls as $url) {
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_multi_add_handle($multiHandle, $ch);
    $handles[] = $ch;
}

// Exécuter une demande并使用 curl_multi_select Améliorer les performances
$running = null;
do {
    $mrc = curl_multi_exec($multiHandle, $running);
    if ($mrc > 0) {
        echo "CURL exec error: " . curl_multi_strerror($mrc);
    }
    curl_multi_select($multiHandle);
} while ($running);

// Obtenir des données de réponse
foreach ($handles as $ch) {
    $response = curl_multi_getcontent($ch);
    echo $response . "\n";
    curl_multi_remove_handle($multiHandle, $ch);
}

// Fermez la poignée
curl_multi_close($multiHandle);

?>

4. Résumé

Pour éviter les interférences dans le traitement des demandes , nous devons nous assurer que toutes les demandes ont été remplies et que la réponse a été retournée correctement. Vous pouvez surveiller l'état d'exécution de la demande, utiliser Curl_Multi_Select pour optimiser les performances et vous assurer que Curl_Multi_Close est appelé une fois la demande terminée pour éviter d'éventuelles interférences.

Grâce à ces méthodes, la stabilité et les performances des demandes simultanées dans PHP peuvent être efficacement améliorées, garantissant que le processus de traitement des demandes est fluide et qu'il n'y a pas d'interférence inutile.