Lorsque vous utilisez l'extension Curl de PHP pour faire de grandes quantités de demandes HTTP, vous pouvez rencontrer un goulot d'étranglement des performances: résolution en double DNS. Chaque fois que vous demandez, le curl doit analyser le nom de domaine une fois, ce qui peut apporter des frais généraux supplémentaires, surtout lorsque vous faites plusieurs demandes au même nom de domaine. Heureusement, PHP fournit une fonction appelée qui peut éviter ce problème en partageant le cache DNS. Cet article vous montrera comment l'utiliser.
curl_share_init () est une fonction fournie par l'extension Curl pour créer une poignée partagée. Cette poignée partagée peut partager des ressources spécifiques entre plusieurs sessions de boucle, telles que le cache DNS, les cookies, les sessions SSL, etc.
Lorsque nous activons le cache DNS partagé, plusieurs demandes n'ont besoin que de résoudre le nom de domaine qu'une seule fois, et les demandes ultérieures peuvent réutiliser directement les résultats, réduisant considérablement la latence du réseau.
Utilisons un exemple simple de code pour expliquer comment l'utiliser:
<?php
// créer cURL Poignée partagée
$sh = curl_share_init();
// Définir les options de partage,Activer DNS commun
curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_DNS);
$urls = [
'https://m66.net/api/data1',
'https://m66.net/api/data2',
'https://m66.net/api/data3',
];
foreach ($urls as $url) {
$ch = curl_init();
// installation URL et d'autres options nécessaires
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// 绑定Poignée partagée
curl_setopt($ch, CURLOPT_SHARE, $sh);
// Exécuter une demande
$response = curl_exec($ch);
if (curl_errno($ch)) {
echo 'erreur: ' . curl_error($ch) . PHP_EOL;
} else {
echo 'réponse: ' . $response . PHP_EOL;
}
// fermeture cURL Session
curl_close($ch);
}
// fermeturePoignée partagée
curl_share_close($sh);
?>
1 ?? Créer une poignée partagée <br> Nous utilisons curl_share_init () pour créer une poignée partagée $ sh .
2 ?? Définir les ressources partagées <br> Avec curl_share_setopt () , nous spécifions les données DNS partagées ( curl_lock_data_dns ).
3 ?? Lier une poignée partagée dans chaque session de curl <br> Dans curl_setopt () , utilisez curlopt_share pour associer la poignée partagée à la poignée Curl actuelle $ ch .
4 ?? Fermez la poignée <br> Après avoir rempli toutes les demandes, n'oubliez pas d'utiliser curl_share_close () pour libérer la poignée partagée.
La poignée partagée doit être fermée une fois toutes les demandes terminées.
Si plusieurs threads ou demandes simultanées sont exécutés simultanément dans le programme, vous devez faire attention à verrouiller les ressources pour éviter les conditions de course.
La même méthode peut être utilisée lors du partage de cookies, de SSL et d'autres données, remplacez simplement la constante Curl_lock_data_ * .
Pour les scénarios impliquant un grand nombre de demandes au même nom de domaine, telles que l'agrégation API, la rampe par lots et les tests de charge, éviter la résolution en double DNS peut généralement apporter environ 10% ~ 30% d'amélioration des performances , en fonction de la vitesse de requête DNS et de la latence du serveur. Bien que tous les scénarios ne puissent pas être considérablement améliorés, il s'agit d'une méthode d'optimisation simple, presque gratuite.