非常に同時のPHPアプリケーションでは、同じドメイン名の頻繁なネットワーク要求が多数のDNSクエリにつながる可能性があります。これにより、サーバー側の負担が増加するだけでなく、パフォーマンスに特定の影響を与える可能性もあります。幸いなことに、libcurlは効率的なソリューション - curl_share_init()関数を提供します。合理的に使用することにより、DNSキャッシュ共有を実装して、重複したDNSクエリを削減し、リクエスト効率を向上させることができます。
curl_share_init()は、共有ハンドル(Curl Shareハンドル)を初期化するためにLibcurlによって提供される関数です。この共有ハンドルを通じて、Cookie、DNSキャッシュ、SSLセッションなどの複数のカールセッション間でデータを共有できます。特に、DNSキャッシュ共有は、同じドメイン名のパフォーマンスを改善するために非常に重要です。
デフォルトでは、CURLを使用してリクエストが開始されるたびにドメイン名を解決するためにDNSクエリが実行されます。例えば:
$ch = curl_init('https://m66.net/api/data');
curl_exec($ch);
curl_close($ch);
上記のリクエストがループで繰り返し実行される場合、DNSクエリは毎回トリガーされ、特に短期間で頻繁に要求される場合、この繰り返される解像度はネットワークの遅延とサーバーの圧力を大幅に増加させます。
DNSキャッシュを共有することにより、複数のカールハンドル間で解決されたドメイン名を再利用でき、重複クエリを回避できます。
curl_share_init()を使用して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() :共有ハンドルを初期化します。
curl_share_setopt() :共有コンテンツをDNSキャッシュに設定します。
curl_setopt($ ch、curlopt_share、$ sh) :共有ハンドルを各Curlリクエストにバインドします。
curl_share_close($ sh) :使用後にリソースをリリースします。
このようにして、すべてのCurl要求は、各リクエストのドメイン名の解像度を回避するために、ループで同じDNSキャッシュを共有しているため、効率を大幅に改善します。
共有ハンドルは、スレッド(マルチスレッド環境など)で使用することはできません。
要求に複数のドメイン名が含まれる場合、同じドメイン名のリクエストのみがDNSキャッシュの利点を享受できます。
メモリリークを避けるために、共有リソースを正しく閉じている必要があります。
DNSクエリを最適化すると、高周波ネットワークリクエストを処理する際のパフォーマンスが大幅に向上する可能性があります。 PHPはcurl拡張子を使用してcurl_share_init()を呼び出し、DNSキャッシュを共有します。これは、シンプルで効率的な最適化方法です。これは、高性能要件に向けられたアプリケーションに試す価値のあるトリックです。適切に配置および使用することにより、サーバーのDNS圧力を大幅に削減し、全体的なネットワーク応答速度を改善できます。