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.
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.
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'é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);
Erreur: fermer la manche multiple sans retirer la poignée
// Mauvaise utilisation
curl_close($ch); // Fermer d'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);
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.
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'exécution maximum sur30Deuxième
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:
Ajouter une seule poignée à une poignée multiple
Exécuter plusieurs manches
Obtenir des résultats
Retirer et fermer une seule poignée
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.