ネットワークリクエストにPHPを使用する場合、Curlライブラリを使用することがよくあります。 Curlは、単純なHTTP要求をサポートするだけでなく、Cookie、DNS、SSLなどの高度な機能もサポートする強力なツールです。
その中で、 curl_share_initは比較的まれなCurl機能であり、DNSキャッシュ、Cookie、SSLセッションなどのデータを共有する複数のCurlハンドルがDNSキャッシュを共有することにより、重複ドメイン名の解像度を削減し、パフォーマンスを向上させることができます。
しかし、実際に使用すると、多くの人が尋ねます。
共有DNSキャッシュは効果的ですか?それを監視する方法は?
この記事では、段階的に分析し、完全なPHPの例を示します。
curl_share_init()関数は、共有ハンドルの初期化に使用されます。 curlopt_share curl_setoptのcurlopt_shareオプションと組み合わせて、複数のCurl要求が特定のデータを共有できるようにします。普通の内容は次のとおりです。
DNSキャッシュ( curl_lock_data_dns )
Cookie( curl_lock_data_cookie )
SSLセッション( curl_lock_data_ssl_session )
例えば:
$sh = curl_share_init();
curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_DNS);
このようにして、複数のカールハンドルが同じ$ shにバインドされ、DNSキャッシュを共有できます。
Curlは「DNSキャッシュヒットを監視する」ためのインターフェイスを提供していませんが、間接的に観察できます。
最初の要求時間消費:最初のリクエストには通常、DNS解像度時間が含まれます。
その後のリクエストの時間をかける:共有DNSが有効になっている場合、同じドメイン名のその後のリクエストは解像度時間を大幅に短縮する必要があります。
言い換えれば、 curlinfo_nameLookup_timeとcurlinfo_total_timeを使用して監視できます。
ドメイン名の解決時間
総時間消費
最初のリクエストのnamelookup_timeとその後のリクエストを比較することにより、DNSキャッシュが有効かどうかを判断できます。
curl_share_initを使用した完全なPHPコードを次に示し、 https://m66.net/testに2つのリクエストを送信し、DNS解像度時間を印刷します。
<?php
$sh = curl_share_init();
curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_DNS);
$url = 'https://m66.net/test';
// 最初のリクエスト
$ch1 = curl_init($url);
curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch1, CURLOPT_SHARE, $sh);
curl_exec($ch1);
$dns_time1 = curl_getinfo($ch1, CURLINFO_NAMELOOKUP_TIME);
$total_time1 = curl_getinfo($ch1, CURLINFO_TOTAL_TIME);
curl_close($ch1);
echo "最初のリクエスト:\n";
echo "DNS 分析時間: {$dns_time1} 2番\n";
echo "総時間消費: {$total_time1} 2番\n";
// 待って12番,新しいリクエストをシミュレートします
sleep(1);
// 2番目のリクエスト
$ch2 = curl_init($url);
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch2, CURLOPT_SHARE, $sh);
curl_exec($ch2);
$dns_time2 = curl_getinfo($ch2, CURLINFO_NAMELOOKUP_TIME);
$total_time2 = curl_getinfo($ch2, CURLINFO_TOTAL_TIME);
curl_close($ch2);
echo "\n2番目のリクエスト:\n";
echo "DNS 分析時間: {$dns_time2} 2番\n";
echo "総時間消費: {$total_time2} 2番\n";
// 掃除
curl_share_close($sh);
?>
?共有の有効化: curl_share_initとcurlshopt_shareを使用して、共有DNSデータを構成します。
?時間を取得する: curl_getinfoを介してcurlinfo_namelookup_timeを取得します。
?比較効果:最初の要求には通常、明らかなDNS時間があります(数十ミリ秒など)。 2回目のキャッシュが有効になった場合、 namelookup_timeは0に近くなります。
同じドメイン名:同じホスト名( M66.NETなど)のみがキャッシュを押すことができます。
PHP Curlバージョン:PHPの古いバージョンの中には、 curl_shareを完全にサポートしていない場合があります。 phpinfo()を使用してCurlバージョンを確認することをお勧めします。
スレッドの安全性:マルチスレッドまたはマルチプロセス環境でcurl_shareを使用する場合は、セキュリティのロックを確認する必要があります。