Dans les applications PHP très concurrentes, les demandes de réseau fréquentes pour le même nom de domaine peuvent conduire à un grand nombre de requêtes DNS. Cela augmentera non seulement le fardeau du côté serveur, mais peut également avoir un certain impact sur les performances. Heureusement, libcurl fournit une solution efficace - la fonction curl_share_init () . En l'utilisant raisonnablement, nous pouvons implémenter le partage de cache DNS, réduisant ainsi les requêtes DNS en double et améliorant l'efficacité de la demande.
curl_share_init () est une fonction fournie par libcurl pour initialiser une poignée partagée (poignée de partage de curl). Grâce à cette poignée partagée, nous pouvons partager des données entre plusieurs sessions de boucles, telles que les cookies, les caches DNS, les séances SSL, etc. En particulier, le partage de cache DNS est d'une grande importance pour améliorer les performances du même nom de domaine fréquemment demandé.
Par défaut, une requête DNS est effectuée pour résoudre le nom de domaine chaque fois qu'une demande est lancée à l'aide de Curl. Par exemple:
$ch = curl_init('https://m66.net/api/data');
curl_exec($ch);
curl_close($ch);
Si la demande ci-dessus est exécutée à plusieurs reprises dans une boucle, la requête DNS sera déclenchée à chaque fois, provoquant des frais généraux de performances inutiles, en particulier lorsqu'ils sont demandés fréquemment dans un court laps de temps, cette résolution répétée augmentera considérablement la latence du réseau et la pression du serveur.
En partageant le cache DNS, nous pouvons réutiliser les noms de domaine résolus entre plusieurs poignées de curl, évitant ainsi les requêtes en double.
Voici un exemple montrant comment utiliser curl_share_init () pour partager un cache DNS:
$sh = curl_share_init();
curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_DNS);
for ($i = 0; $i < 10; $i++) {
$ch = curl_init('https://m66.net/api/data');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SHARE, $sh);
$response = curl_exec($ch);
if (curl_errno($ch)) {
echo 'Error: ' . curl_error($ch) . PHP_EOL;
}
curl_close($ch);
}
curl_share_close($sh);
curl_share_init () : initialisez une poignée partagée.
curl_share_setopt () : définissez le contenu partagé sur cache DNS.
curl_setopt ($ ch, curlopt_share, $ sh) : lier la poignée partagée à chaque demande de curl.
curl_share_close ($ sh) : libérez la ressource après utilisation.
De cette façon, toutes les demandes Curl partagent le même cache DNS dans une boucle, en évitant la résolution de nom de domaine pour chaque demande, améliorant ainsi considérablement l'efficacité.
Les poignées partagées ne peuvent pas être utilisées sur les threads (comme dans les environnements multithread).
Si la demande implique plusieurs noms de domaine, seules les demandes de nom de domaine peuvent bénéficier des avantages de la mise en cache DNS.
Les ressources partagées doivent être fermées correctement pour éviter les fuites de mémoire.
L'optimisation des requêtes DNS peut entraîner des améliorations de performances significatives lors du traitement des demandes de réseau à haute fréquence. PHP utilise une extension Curl pour appeler Curl_share_Init () et partager le cache DNS, qui est une méthode d'optimisation simple et efficace. Il s'agit d'une astuce qui mérite d'être essayée pour les applications orientées vers des exigences de haute performance. En le plaçant et en l'utilisant correctement, vous pouvez réduire considérablement la pression DNS sur le serveur et améliorer la vitesse globale de réponse du réseau.