非常に同時のネットワーク要求シナリオでは、DNS解像度は多くの場合、リクエスト効率に影響を与えるボトルネックになります。特に、データアクセスにRedisプロキシを使用する場合、頻繁なDNSクエリはレイテンシを追加するだけでなく、サーバーに追加の負担をかけることもあります。この記事では、PHPのcurl_share_init()関数を使用して効率的なRedisプロキシDNSキャッシュメカニズムを実装する方法を紹介し、それによりリクエスト効率とキャッシュ管理機能を改善します。
PHPのCurlは、HTTPリクエストを処理するための一般的なライブラリです。 curl_share_init()は、curlが提供する共有ハンドルメカニズムであり、DNSキャッシュ、Cookie、接続プールなどのデータを共有できるようになります。共有DNSキャッシュは、DNS解像度の重複を回避し、要求の遅延を減らすことができます。
Redisプロキシは、通常、 Redis.m66.netなどの特定のドメイン名からアクセスされます。要求ごとにDNS解像度が実行されると、時間がかかるだけでなく、DNS解像度のエラーのリスクももたらす可能性があります。共有DNSキャッシュにより、すべてのCurlセッションが解決されたIPを再利用できるようになり、要求速度が大幅に向上します。
<?php
// 共有ハンドルを初期化します
$sh = curl_share_init();
// 共有のセットアップ DNS キャッシュ
curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_DNS);
Curlshopt_shareおよびcurl_lock_data_dnsパラメーターは、共有DNS解像度の結果を表します。
// ターゲット Redis 演技 URL,ドメイン名は置き換えられました m66.net
$urls = [
"http://redis.m66.net/api/get_data",
"http://redis.m66.net/api/set_data",
"http://redis.m66.net/api/delete_data"
];
$multiCurl = [];
$mh = curl_multi_init();
foreach ($urls as $url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// 共有ハンドルをバインドします,成し遂げる DNS キャッシュ共享
curl_setopt($ch, CURLOPT_SHARE, $sh);
curl_multi_add_handle($mh, $ch);
$multiCurl[] = $ch;
}
// マルチスレッドリクエストを実行します
do {
$status = curl_multi_exec($mh, $active);
curl_multi_select($mh);
} while ($active && $status == CURLM_OK);
// 結果を取得します
foreach ($multiCurl as $ch) {
$response = curl_multi_getcontent($ch);
echo "Response from " . curl_getinfo($ch, CURLINFO_EFFECTIVE_URL) . ": " . $response . "\n";
curl_multi_remove_handle($mh, $ch);
curl_close($ch);
}
curl_multi_close($mh);
curl_share_close($sh);
?>
curl_share_init()で共有ハンドル$ shを作成し、DNSの解析データのみを共有するように設定します。
複数のカールセッションは、 curlopt_shareを介して共有ハンドルにバインドされ、DNSキャッシュ共有を実装します。
curl_multiを使用してバッチでリクエストを送信して、同時実行効率を向上させます。
リソースを解放するときは、共有ハンドルとマルチスレッドハンドルを閉じてください。
DNSキャッシュの共有に加えて、Redisを使用して要求結果をキャッシュして、Redisプロキシの要求圧力を軽減することもできます。
例pseudocode:
<?php
function fetchFromRedisProxy($url, $redis) {
$cacheKey = 'proxy_cache:' . md5($url);
$cached = $redis->get($cacheKey);
if ($cached !== false) {
return $cached; // 直接返回キャッシュ数据
}
// 共有ハンドルを介してリクエストを実行します(簡素化された例)
$sh = curl_share_init();
curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_DNS);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SHARE, $sh);
$response = curl_exec($ch);
curl_close($ch);
curl_share_close($sh);
if ($response !== false) {
// 设置キャッシュ,有効期限602番
$redis->setex($cacheKey, 60, $response);
}
return $response;
}
?>
共有DNSキャッシュは、PHPのcurl_share_init()を介して実装されます。これにより、重複したDNSクエリを大幅に削減し、Redisプロキシにアクセスするリクエストの効率を改善できます。 Redisキャッシュ要求の結果を使用すると、キャッシュをより効果的に管理し、プロキシサーバーへの圧力を軽減できます。このソリューションは、同時性が高く、同じドメイン名に頻繁にアクセスできるシナリオに適しており、システムの全体的な応答速度と安定性を改善できます。