パフォーマンスの最適化は、大規模なAPIクロールタスクを実行する場合に重要です。 PHPとCURLを使用している開発者の場合、 curl_share_init()の合理的な使用は、システムリソースの消費を大幅に削減し、効率を改善できます。この記事では、機能、使用法のシナリオ、およびコードに正しく実装する方法を詳細に紹介します。
curl_share_init()は、共有ハンドル(Curl Shareハンドル)を初期化するためにPHP Curl拡張機能によって提供される関数です。ハンドルを共有することにより、DNSキャッシュ、SSLセッションキャッシュ、Cookieなどのリソースを複数のカールイージーハンドル間で共有し、繰り返し接続を回避したり、ドメイン名の繰り返し解像度を回避したり、複数の同時リクエストのパフォーマンスを大幅に改善できます。
要するに、この関数のコア関数は「リソース共有と重複作業の削減」です。
たとえば、数百または数千のHTTPリクエストを同時に行う必要がある場合:
大きなREST APIデータベースをクロールします。
複数のサードパーティのデータソースを定期的に同期します。
同時性が高い同じAPIエンドポイントにアクセスします。
各リクエストがDNSクエリとSSLハンドシェイクを個別に確立する場合、これにより膨大なパフォーマンスの廃棄物が生じる可能性があります。 curl_share_init()を使用すると、これらのリクエストが部分的なキャッシュを共有し、頭上を削減できます。
curl_share_init()を使用して、大規模なAPIクロールタスクを最適化するためのサンプルコードを次に示します。
<?php
// 共有ハンドルを初期化します
$sh = curl_share_init();
// 共有リソースタイプを設定します,ここで共有します DNS そして Cookie
curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_DNS);
curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_COOKIE);
$urls = [
'https://m66.net/api/data1',
'https://m66.net/api/data2',
'https://m66.net/api/data3',
// さらに追加することができます API 住所
];
$multiHandle = curl_multi_init();
$curlHandles = [];
// それぞれを初期化します cURL easy ハンドル
foreach ($urls as $i => $url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// 绑定共享ハンドル
curl_setopt($ch, CURLOPT_SHARE, $sh);
curl_multi_add_handle($multiHandle, $ch);
$curlHandles[$i] = $ch;
}
// 同時リクエストを実行します
$running = null;
do {
curl_multi_exec($multiHandle, $running);
curl_multi_select($multiHandle);
} while ($running > 0);
// 結果を取得します
foreach ($curlHandles as $i => $ch) {
$response = curl_multi_getcontent($ch);
echo "Response from {$urls[$i]}:\n";
echo $response . "\n";
curl_multi_remove_handle($multiHandle, $ch);
curl_close($ch);
}
// 無料のリソース
curl_share_close($sh);
curl_multi_close($multiHandle);
共有リソース設定<br> curl_share_setopt()を使用して共有リソースタイプを指定するために一般的に使用されます。
curl_lock_data_dns :共有DNSキャッシュ。
curl_lock_data_cookie :Cookieを共有します。
curl_lock_data_ssl_session :SSLセッションを共有します。
プロセス間で共有しないでください
Curlの共有ハンドルは、同じプロセスにのみ適用されます。マルチプロセスクロールには、他のメカニズム(外部キャッシュやデータベースなど)の使用が必要です。
リソースを正しくリリースします<BR> クロールタスクが終了したら、メモリの漏れを避けるために、 curl_share_close()とcurl_multi_close( )に電話することを忘れないでください
DNSとSSLセッションの共有を有効にすることにより、次を避けることができます。
同じドメイン名を繰り返します(特に同じドメインからの多数のリクエストの場合)。
SSLの握手を繰り返します(特にHTTPSリクエスト)。
実際のテストでは、数百の同時リクエストの場合、この最適化はCPUとネットワークの負荷を大幅に削減し、全体的なスループットを改善できます。