Lors du développement de programmes PHP, l'utilisation de la fonction curl_upkeep () peut gérer et maintenir efficacement les connexions demandées HTTP. Cependant, de nombreux développeurs constatent que les connexions sont souvent reconstruites, entraînant une dégradation des performances lors de l'utilisation de cette fonction. Cet article analysera plusieurs raisons qui pourraient entraîner une reconstruction fréquente des connexions et fournir des solutions.
Lors de la réalisation de demandes HTTP, il est crucial de s'assurer que les en-têtes de demande sont correctement définis. En particulier, les en-têtes de connexion et de conservation , si ces en-têtes ne sont pas définis correctement, le serveur peut penser que chaque demande est une nouvelle connexion, reconstruisant ainsi fréquemment la connexion.
Solution:
Assurez-vous de définir l'en-tête de demande HTTP correct dans la fonction curl_upkeep () :
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://m66.net/some-api-endpoint");
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
"Connection: Keep-Alive", // Rester connecté
"Keep-Alive: 300" // Permettre à la connexion de rester300Deuxième
));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
En définissant "Connexion: Keep-Alive" et "Keep-Alive: 300" , vous pouvez vous assurer que le serveur réutilise autant que possible les connexions au lieu de reconstruire à chaque fois.
La fonction curl_upkeep () définira une certaine limite de délai d'expiration par défaut. Si le paramètre de délai d'expiration de la demande est trop court et que la réponse du serveur ne revient pas dans le temps, la connexion sera fermée, ce qui entraîne un rétablissement de la connexion chaque fois que la demande est demandée.
Solution:
Ajustez l'heure des options Curlopt_timeout et Curlopt_ConnectTimeout et augmentez le temps d'attente pour éviter une reconstruction de connexion fréquente causée par un court délai:
curl_setopt($ch, CURLOPT_TIMEOUT, 60); // Définir le temps de demande maximum
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30); // Définir le temps de délai de connexion
Certains serveurs peuvent ne pas avoir des connexions persistantes activées (Keep-Alive). Même si le client est défini pour conserver la connexion, le serveur déconnecte fréquemment et reconstruis la connexion si elle ne prend pas en charge la fonctionnalité.
Solution:
Confirmez si les connexions persistantes sont activées du côté serveur. Si vous avez la permission d'accéder à la configuration du serveur, vérifiez la configuration d'Apache ou Nginx pour vous assurer que Keep-Alive est activée.
Dans le fichier de configuration Apache, assurez-vous que les paramètres suivants existent:
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 15
Si votre application est déployée dans un environnement équilibré à charge, l'équilibreur de charge peut provoquer une reconstruction fréquente des connexions. Les équilibreurs de chargement ferment et rétablissent parfois les connexions au serveur en raison de problèmes de perte de session ou de configuration.
Solution:
Vérifiez la configuration de l'équilibreur de charge, assurez-vous que l'adhérence de la session est activée ou ajustez le comportement de l'équilibreur de charge pour éviter une déconnexion fréquente.
Si le protocole utilisé entre le client et le serveur ne correspond pas (comme HTTP / 1.1 et HTTP / 2), il peut également conduire à des reconstructions de connexions fréquentes. En particulier, HTTP / 2 offre une meilleure fonctionnalité de multiplexage de connexion, ce qui peut également affecter la persistance de la connexion si le client et le serveur ne négocient pas correctement le protocole.
Solution:
Utilisez Curlopt_http_version pour spécifier explicitement la version du protocole:
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); // ou CURL_HTTP_VERSION_2
Si l'instance Curl est réinitialisée à chaque demande, une nouvelle connexion sera établie pour chaque demande. Pour multiplexer les connexions, vous pouvez envisager des instances Curl multiplexing ou utiliser un pool de connexion persistant (comme via la fonction curl_multi_ * ).
Solution:
Essayez d'éviter d'initialiser Curl à chaque fois et de réutiliser les instances de curl pour maintenir la connexion: