Position actuelle: Accueil> Derniers articles> Utilisez Curl_close correctement dans les boucles pour éviter les fuites de mémoire

Utilisez Curl_close correctement dans les boucles pour éviter les fuites de mémoire

gitbox 2025-05-28

Curl est un outil pour échanger des données avec des serveurs. Il prend en charge une variété de protocoles, notamment HTTP, HTTPS, FTP, etc. L'extension Curl en PHP fournit une interface simple qui vous permet de lancer facilement les demandes, de recevoir des réponses et de gérer les erreurs connexes.

Lors de la réalisation de plusieurs demandes HTTP, les ressources de la Curl sont limitées, ces ressources doivent donc être publiées à temps une fois la demande terminée. Ceci est réalisé en appelant la fonction curl_close () . Si les demandes HTTP sont fréquemment initiées dans une boucle sans fermer la connexion, cela entraînera des fuites de mémoire et même une dégradation des performances du serveur.

Utilisation de base de la boucle

Lors de la demande de boucle, nous suivons généralement les étapes suivantes:

  1. Initialisez la session Curl.

  2. Définir les paramètres de demande.

  3. Exécutez la demande et obtenez la réponse.

  4. Fermez la session Curl.

 $ch = curl_init(); // initialisation cURL Session
curl_setopt($ch, CURLOPT_URL, "https://gitbox.net/some-endpoint"); // Configurer une demande URL
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // Obtenez le contenu de la réponse
$response = curl_exec($ch); // Exécuter une demande
curl_close($ch); // 关闭Session

Problème de fuite de mémoire en boucle

Lorsque les demandes sont fréquemment initiées dans une boucle, chaque demande alloue la mémoire pour stocker les informations de connexion. Si la session Curl n'est pas fermée dans le temps pendant chaque itération de la boucle, une fuite de mémoire se produira. Cela peut entraîner des scripts PHP à consommer trop de mémoire, ce qui entraînera éventuellement des problèmes de performances et même des plantages sur le serveur.

Par exemple, sans fermer correctement une session Curl, les demandes de la boucle accumulent, consommant de plus en plus de mémoire.

 // Démonstration d'erreur:Non fermé en boucle cURL Session
for ($i = 0; $i < 1000; $i++) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, "https://gitbox.net/some-endpoint");
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $response = curl_exec($ch);
    // Oublié d&#39;appeler curl_close()
}

Utilisation de la boucle correcte

Pour éviter les fuites de mémoire, nous devons nous assurer que la fonction curl_close () est appelée une fois chaque demande terminée. Le moyen le plus simple consiste à mettre Curl_close () à l'intérieur de la boucle pour s'assurer que les ressources sont libérées une fois chaque demande terminée.

 // Démonstration correcte:Fermer en boucle cURL Session
for ($i = 0; $i < 1000; $i++) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, "https://gitbox.net/some-endpoint");
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $response = curl_exec($ch);
    curl_close($ch); // 及时关闭Session
}

En fermant la session Curl une fois chaque demande terminée, assurez-vous que la mémoire PHP n'est pas gaspillée et que les ressources pour chaque demande HTTP sont publiées à temps.

Réduire les goulots d'étranglement des performances à l'aide de la boucle multithread

Les boucles à thread unique peuvent être très lentes lors du traitement d'un grand nombre de demandes. Si vous devez gérer un grand nombre de demandes et avoir besoin d'améliorer l'efficacité de l'exécution, vous pouvez envisager d'utiliser Curl multithread (également appelé curl simultané). Cela peut réduire considérablement le temps des demandes et éviter les goulots d'étranglement causés par des opérations d'E / S fréquentes.

 // Utilisation du multi-threading cURL Pour optimiser les performances
$mh = curl_multi_init(); // initialisation cURL 多线程Session
$handles = [];

for ($i = 0; $i < 1000; $i++) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, "https://gitbox.net/some-endpoint");
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_multi_add_handle($mh, $ch); // Mettre chacun cURL 句柄添加到多线程Session中
    $handles[] = $ch;
}

// Effectuer des demandes multipliques
$active = null;
do {
    $mrc = curl_multi_exec($mh, $active);
} while ($active > 0);

// Fermer tous cURL Session
foreach ($handles as $ch) {
    curl_multi_remove_handle($mh, $ch);
    curl_close($ch);
}

curl_multi_close($mh); // 关闭多线程Session

Cela permet de traiter plusieurs demandes en parallèle en un seul processus sans bloquer le programme principal, améliorant ainsi considérablement les performances.