curl_share_init()関数は、共有リソースのCurlハンドルを作成するために使用されます。この共有リソースハンドルを通じて、複数のカールセッション(つまり、複数のカールハンドル)は、Cookie、DNSクエリキャッシュなどの同じリソースを共有できます。このメカニズムの主な目的は、DNSクエリ、Cookie配信、その他の操作などのネットワークリクエストを重複しないようにすることで、同時リクエストの効率を改善することです。
複数のカールセッションを使用する場合、各セッションはドメイン名を再分解してCookieやその他のリソースを取得する必要がある場合があります。リソースを共有することにより、これらの冗長操作を回避できます。
curl_share_init()関数を介して、いくつかの基礎となるリソースをCurlセッション間で共有できます。これにより、複数のリクエスト間で重複する作業が減少します。 HTTPリクエスト(DNSクエリ、Cookieなど)の多くの操作は、マルチスレッドリクエストを行うときに共有され、共有リソースを使用すると、これらの操作のオーバーヘッドが大幅に削減されます。
複数の同時リクエストを行っており、各リクエストには独立したDNSクエリ、Cookie保存、その他の操作が必要であるとします。これらの操作自体が特定のパフォーマンスオーバーヘッドを引き起こします。これらの操作をさまざまなリクエスト間で共有できる場合、リクエストの実行の効率を大幅に改善し、リクエストごとの時間消費を削減できます。
以下は、 curl_share_init()関数を使用した簡単な例であり、リソースを共有してPHPマルチスレッドリクエストのパフォーマンスを改善する方法を示しています。
<?php
// 共有リソースを初期化します
$ch_share = curl_share_init();
curl_share_setopt($ch_share, CURLSHOPT_SHARE, CURL_LOCK_DATA_COOKIE);
curl_share_setopt($ch_share, CURLSHOPT_SHARE, CURL_LOCK_DATA_DNS);
// 同時リクエストを設定します URL リスト
$urls = [
'http://m66.net/api/data1',
'http://m66.net/api/data2',
'http://m66.net/api/data3',
];
// 複数を作成します cURL ハンドル
$multi_handle = curl_multi_init();
$curl_handles = [];
foreach ($urls as $url) {
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SHARE, $ch_share); // 共有リソースを使用します
curl_multi_add_handle($multi_handle, $ch);
$curl_handles[] = $ch;
}
// 同時リクエストを実行します
$running = null;
do {
curl_multi_exec($multi_handle, $running);
curl_multi_select($multi_handle);
} while ($running > 0);
// リクエスト結果を取得して出力します
foreach ($curl_handles as $ch) {
$response = curl_multi_getcontent($ch);
echo $response . "\n";
curl_multi_remove_handle($multi_handle, $ch);
}
// リソースを閉じます
curl_multi_close($multi_handle);
curl_share_close($ch_share);
?>
共有リソースの初期化:まず、 curl_share_init()を介して共有リソースハンドル$ ch_shareを作成します。次に、 curl_share_setopt()を使用して共有リソースのタイプを設定し、CookieやDNSデータなどの共有リソースを指定します。
同時リクエストのURLリストの設定:同時に要求される複数のURLを表すURLの配列を定義します。
CURLハンドルの作成:各URLについて、Curlハンドルを作成し、以前に作成した共有リソースハンドル$ CH_SHAREにCurlopt_shareオプションを設定します。
同時実行リクエスト: curl_multi_init()を使用して、マルチハンドルCurlリソース$ multi_handleを作成し、リソースに複数のCurlハンドルを追加します。同時リクエストは、すべてのリクエストが完了するまでcurl_multi_exec()を介して実行されます。
結果を取得して出力します: curl_multi_getContent()を介して各リクエストの返品結果を取得し、出力します。
リソースを閉じる:リクエストを完了した後、 curl_multi_close()を使用してマルチハンドルリソースを閉じ、最後にcurl_share_close()を介して共有リソースハンドルを閉じます。
curl_share_init()を使用することにより、リクエストごとに独立したDNSクエリとCookieを回避します。特定のパフォーマンス改善効果は、さまざまなネットワーク環境とリクエスト数に基づいて測定する必要があります。多数の同時リクエストの場合、重複したDNSクエリとリソースの読み込みを減らすと、リクエストの全体的なパフォーマンスが大幅に向上する可能性があります。
ただし、 curl_share_init()はすべてのシナリオで機能しません。要求されたコンテンツが完全に異なり、要求された各リソースを個別に処理する必要がある場合、共有リソースを使用すると、パフォーマンスが大幅に改善されない場合があります。共有Curlリソースを使用すると、複数のリクエストが特定のリソースを共有する必要がある場合にのみ機能します。
curl_share_init()関数は、特に共有リソース(Cookie、DNSキャッシュなど)を含む場合、マルチスレッドリクエストのパフォーマンスの改善を提供します。共有リソースを合理的に利用することにより、重複操作を削減し、同時リクエストの効率を最適化できます。ただし、 curl_share_init()を使用すると、共有リソースが不要な状況では、パフォーマンスが大幅に向上しない場合があります。したがって、この関数を使用するかどうかは、特定の要件とシナリオに基づいて決定する必要があります。