現在の位置: ホーム> 最新記事一覧> curl_share_init()はパフォーマンスをどのくらい改善しますか?

curl_share_init()はパフォーマンスをどのくらい改善しますか?

M66 2025-05-18

curl_share_init()関数は、共有リソースのCurlハンドルを作成するために使用されます。この共有リソースハンドルを通じて、複数のカールセッション(つまり、複数のカールハンドル)は、Cookie、DNSクエリキャッシュなどの同じリソースを共有できます。このメカニズムの主な目的は、DNSクエリ、Cookie配信、その他の操作などのネットワークリクエストを重複しないようにすることで、同時リクエストの効率を改善することです。

複数のカールセッションを使用する場合、各セッションはドメイン名を再分解してCookieやその他のリソースを取得する必要がある場合があります。リソースを共有することにより、これらの冗長操作を回避できます。

curl_share_init()によるパフォーマンスを改善する方法は?

curl_share_init()関数を介して、いくつかの基礎となるリソースをCurlセッション間で共有できます。これにより、複数のリクエスト間で重複する作業が減少します。 HTTPリクエスト(DNSクエリ、Cookieなど)の多くの操作は、マルチスレッドリクエストを行うときに共有され、共有リソースを使用すると、これらの操作のオーバーヘッドが大幅に削減されます。

複数の同時リクエストを行っており、各リクエストには独立したDNSクエリ、Cookie保存、その他の操作が必要であるとします。これらの操作自体が特定のパフォーマンスオーバーヘッドを引き起こします。これらの操作をさまざまなリクエスト間で共有できる場合、リクエストの実行の効率を大幅に改善し、リクエストごとの時間消費を削減できます。

curl_share_init()を使用したコードの例

以下は、 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);

?>

コード解析

  1. 共有リソースの初期化:まず、 curl_share_init()を介して共有リソースハンドル$ ch_shareを作成します。次に、 curl_share_setopt()を使用して共有リソースのタイプを設定し、CookieやDNSデータなどの共有リソースを指定します。

  2. 同時リクエストのURLリストの設定:同時に要求される複数のURLを表すURLの配列を定義します。

  3. CURLハンドルの作成:各URLについて、Curlハンドルを作成し、以前に作成した共有リソースハンドル$ CH_SHARECurlopt_shareオプションを設定します。

  4. 同時実行リクエストcurl_multi_init()を使用して、マルチハンドルCurlリソース$ multi_handleを作成し、リソースに複数のCurlハンドルを追加します。同時リクエストは、すべてのリクエストが完了するまでcurl_multi_exec()を介して実行されます。

  5. 結果を取得して出力しますcurl_multi_getContent()を介して各リクエストの返品結果を取得し、出力します。

  6. リソースを閉じる:リクエストを完了した後、 curl_multi_close()を使用してマルチハンドルリソースを閉じ、最後にcurl_share_close()を介して共有リソースハンドルを閉じます。

パフォーマンス改善効果

curl_share_init()を使用することにより、リクエストごとに独立したDNSクエリとCookieを回避します。特定のパフォーマンス改善効果は、さまざまなネットワーク環境とリクエスト数に基づいて測定する必要があります。多数の同時リクエストの場合、重複したDNSクエリとリソースの読み込みを減らすと、リクエストの全体的なパフォーマンスが大幅に向上する可能性があります。

ただし、 curl_share_init()はすべてのシナリオで機能しません。要求されたコンテンツが完全に異なり、要求された各リソースを個別に処理する必要がある場合、共有リソースを使用すると、パフォーマンスが大幅に改善されない場合があります。共有Curlリソースを使用すると、複数のリクエストが特定のリソースを共有する必要がある場合にのみ機能します。

要約します

curl_share_init()関数は、特に共有リソース(Cookie、DNSキャッシュなど)を含む場合、マルチスレッドリクエストのパフォーマンスの改善を提供します。共有リソースを合理的に利用することにより、重複操作を削減し、同時リクエストの効率を最適化できます。ただし、 curl_share_init()を使用すると、共有リソースが不要な状況では、パフォーマンスが大幅に向上しない場合があります。したがって、この関数を使用するかどうかは、特定の要件とシナリオに基づいて決定する必要があります。