PHPでは、Curlを使用してHTTPリクエストを作成することは非常に一般的な操作です。 Curlは、HTTP要求のすべての側面を管理するための豊富な機能を提供しますが、Curl自体には大規模な同時リクエストのパフォーマンスボトルネックがある場合があります。この問題を解決するために、 curl_share_init関数を使用することができます。これにより、複数のCurl要求が同じCurlハンドルを共有し、リソースのオーバーヘッドを削減し、パフォーマンスを向上させることができます。
curl_share_init関数は、PHPのCurl拡張機能によって提供される関数です。さまざまなカールセッションがいくつかのリソース(Cookie、HTTPヘッダー情報、DNSクエリなど)を共有できるようにします。リソースを共有することにより、複数のリクエストにより、初期化プロセスの重複を回避でき、効率が向上します。
curl_share_initを使用すると、共有Curlリソースを作成し、この共有リソースに複数のCurlリクエストをバインドして、処理時に同じリソースを効果的に再利用できるようにします。
Guzzleは、PHPで非常に人気のあるHTTPクライアントであり、Curlおよびその他のHTTPトランスポートメソッドをカプセル化し、リクエストを送信して応答を受信するための簡単なAPIを提供します。 Guzzleの利点は、非同期リクエスト、リクエストの再試行、同時リクエストおよびその他の機能をサポートすることです。
ただし、Guzzleのデフォルトの実装では、Curlハンドルの共有を直接サポートしていないため、パフォーマンスを改善し、Curlハンドルを共有する場合は、 Curl_share_init関数を手動で統合する必要があります。
Guzzleでcurl_share_initを統合するには、GuzzleのCurl構成のカスタマイズを行う必要があります。 Guzzleでcurl_share_initを使用する方法の基本的な例を次に示します。
<?php
use GuzzleHttp\Client;
use GuzzleHttp\HandlerStack;
use GuzzleHttp\Handler\CurlHandler;
// 共有を作成します cURL ハンドル
$curlShare = curl_share_init();
// 共有オプションを構成します
curl_share_setopt($curlShare, CURLSHOPT_SHARE, CURL_LOCK_DATA_COOKIE);
curl_share_setopt($curlShare, CURLSHOPT_SHARE, CURL_LOCK_DATA_DNS);
// aを作成します Guzzle クライアント
$stack = HandlerStack::create(new CurlHandler());
$stack->push(function($request, $options) use ($curlShare) {
// 得る cURL ハンドル并与共享ハンドル绑定
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $request->getUri());
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SHARE, $curlShare);
// リクエストを実行します
$response = curl_exec($ch);
curl_close($ch);
return $response;
}, 'curl_share_handler');
$client = new Client(['handler' => $stack]);
// リクエストを送信します
$response = $client->request('GET', 'http://m66.net/someendpoint');
// 印刷応答
echo $response->getBody();
?>
この例では、まず共有Curlリソース$ curlshareを作成し、 curl_share_setopt (CookieやDNSなど)を介して共有するリソースを構成します。次に、カスタムガズルハンドラストックを作成し、プッシュメソッドを介してカスタム処理ロジックをスタックに追加します。処理ロジックでは、Curlハンドルを明示的に作成し、 Curl_setoptを使用して共有リソースにバインドします。
複数のHTTPリクエスト間でカールハンドルを共有すると、各リクエストのオーバーヘッドを効果的に削減できます。特に大規模な同時リクエストでは、 curl_share_initは、Curlハンドルを繰り返し初期化し、Cookie、DNSなどのリソースを共有する時間を短縮でき、それによりリクエストの処理速度が向上します。
たとえば、複数のリクエストがあるシナリオでは、 curl_share_initを使用した後、各リクエストはDNS情報とCookieを共有できるため、重複したDNSクエリとCookie処理を回避できます。これは、パフォーマンスの大幅な改善です。
Guzzleまたは他のHTTPクライアントにcurl_share_init関数を統合することにより、Curlハンドルを共有して、リクエスト管理の効率を向上させることができます。共有リソースは、重複操作を削減するだけでなく、特に高い並行性環境に適したリクエストの応答速度を改善します。 Guzzleにcurl_share_initを統合する方法は比較的簡単であり、ハンドラストックをカスタマイズし、Curl共有ハンドルを適切に構成することにより、複数のHTTP要求を効率的に管理できます。