現在の位置: ホーム> 最新記事一覧> curl_share_init()を使用して、大規模なAPIクロールタスクを最適化する

curl_share_init()を使用して、大規模なAPIクロールタスクを最適化する

M66 2025-05-28

パフォーマンスの最適化は、大規模なAPIクロールタスクを実行する場合に重要です。 PHPとCURLを使用している開発者の場合、 curl_share_init()の合理的な使用は、システムリソースの消費を大幅に削減し、効率を改善できます。この記事では、機能、使用法のシナリオ、およびコードに正しく実装する方法を詳細に紹介します。

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);

キーポイント

  1. 共有リソース設定<br> curl_share_setopt()を使用して共有リソースタイプを指定するために一般的に使用されます。

    • curl_lock_data_dns :共有DNSキャッシュ。

    • curl_lock_data_cookie :Cookieを共有します。

    • curl_lock_data_ssl_session :SSLセッションを共有します。

  2. プロセス間で共有しないでください
    Curlの共有ハンドルは、同じプロセスにのみ適用されます。マルチプロセスクロールには、他のメカニズム(外部キャッシュやデータベースなど)の使用が必要です。

  3. リソースを正しくリリースします<BR> クロールタスクが終了したら、メモリの漏れを避けるために、 curl_share_close()とcurl_multi_close( )に電話することを忘れないでください

パフォーマンスのメリット

DNSとSSLセッションの共有を有効にすることにより、次を避けることができます。

  • 同じドメイン名を繰り返します(特に同じドメインからの多数のリクエストの場合)。

  • SSLの握手を繰り返します(特にHTTPSリクエスト)。

実際のテストでは、数百の同時リクエストの場合、この最適化はCPUとネットワークの負荷を大幅に削減し、全体的なスループットを改善できます。