PHPのCurl拡張機能を使用して大量のHTTPリクエストを作成する場合、パフォーマンスボトルネックに遭遇する可能性があります。DNS複製解像度。要求するたびに、カールはドメイン名を一度解析する必要があります。これにより、特に同じドメイン名に複数のリクエストを行う場合は、追加の時間オーバーヘッドをもたらすことができます。幸いなことに、PHPは、DNSキャッシュを共有することにより、この問題を回避できるという関数を提供します。この記事では、使用方法を示します。
curl_share_init()は、共有ハンドルを作成するためにCurl拡張機能によって提供される関数です。この共有ハンドルは、DNSキャッシュ、Cookie、SSLセッションなど、複数のカールセッション間で特定のリソースを共有できます。
共有DNSキャッシュを有効にする場合、複数のリクエストはドメイン名を一度解決する必要があり、その後のリクエストは結果を直接再利用して、ネットワークの遅延を大幅に削減できます。
簡単な例コードを使用して、使用方法を説明しましょう。
<?php
// 作成する cURL 共有ハンドル
$sh = curl_share_init();
// 共有オプションを設定します,有効にする DNS 共有
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();
// 設定 URL その他の必要なオプション
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// 绑定共有ハンドル
curl_setopt($ch, CURLOPT_SHARE, $sh);
// リクエストを実行します
$response = curl_exec($ch);
if (curl_errno($ch)) {
echo '間違い: ' . curl_error($ch) . PHP_EOL;
} else {
echo '応答: ' . $response . PHP_EOL;
}
// 閉鎖 cURL セッション
curl_close($ch);
}
// 閉鎖共有ハンドル
curl_share_close($sh);
?>
1 ??共有ハンドルを作成<BR> curl_share_init()を使用して、共有ハンドル$ shを作成します。
2 ??共有リソースを設定<BR> curl_share_setopt()を使用すると、共有DNSデータ( curl_lock_data_dns )を指定します。
3 ??各カールセッションで共有ハンドルをバインドします<br> curl_setopt()では、 curlopt_shareを使用して、共有ハンドルを現在のcurlハンドル$ chに関連付けます。
4 ??ハンドルを閉じます<br> すべてのリクエストを完了したら、 curl_share_close()を使用して共有ハンドルをリリースすることを忘れないでください。
すべてのリクエストが完了した後、共有ハンドルは閉じている必要があります。
プログラムで複数のスレッドまたは同時リクエストが同時に実行されている場合は、人種条件を防ぐためにリソースをロックするように注意する必要があります。
Cookie、SSL、その他のデータを共有するときに同じ方法を使用できます。Curl_Lock_Data_*定数を置き換えるだけです。
API集約、バッチクロール、負荷テストなど、同じドメイン名への多数のリクエストを含むシナリオの場合、DNSの重複解像度を回避すると、DNSクエリ速度とサーバーの遅延に応じて、約10%〜30%のパフォーマンス改善が得られます。すべてのシナリオを大幅に改善できるわけではありませんが、シンプルでほとんどコストのない最適化方法です。