現在の位置: ホーム> 最新記事一覧> PHPのcurl_share_init関数を使用して、マルチスレッドエクステンションの共有リソースサポートを追加する方法は?

PHPのcurl_share_init関数を使用して、マルチスレッドエクステンションの共有リソースサポートを追加する方法は?

M66 2025-06-11

同時リクエストを処理する場合、特に同時データクロールまたはAPI呼び出しがPHPで使用されるシナリオでは、リソースの重複した負荷と接続の確立のコストは無視できません。 curl_share_init関数は、libcurlが提供する高度な機能です。複数のカールセッションがDNSキャッシュ、SSLセッション、Cookieなどの特定のリソースを共有できるため、マルチスレッド環境でのパフォーマンスが向上します。

この記事では、PHPでcurl_share_initを使用してCurlリソース共有を実装する方法を紹介し、例と組み合わせて使用​​する方法を説明します。

curl_share_initとは何ですか?

curl_share_initは、共有ハンドル( Curl Shareハンドル)を初期化するためにLibcurlが提供する関数です。このハンドルは、複数のCurl要求とデータを共有することができ、繰り返しの初期化、解析、または交渉プロセスを回避できます。

適用可能なシナリオ

  • マルチスレッドまたはマルチプロセスクローラーの使用など、高い同時リクエストシナリオ。

  • 同じホストにアクセスし、DNSキャッシュを共有する必要がある複数のリクエスト。

  • 同じCookieまたはSSLセッションを使用した複数のリクエスト。

PHPで使用する方法は?

PHPでは、 curl_share_init()curl_share_setopt()curl_setopt()などの関数を使用して、共有リソースを実装できます。これが完全な例です。

サンプルコード

<?php

// 共有ハンドルを初期化します
$sh = curl_share_init();

// 共有オプションを設定します,ここで共有します Cookie そして DNS
curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_COOKIE);
curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_DNS);

// 複数を作成します cURL セッション
$urls = [
    'https://m66.net/api/data1',
    'https://m66.net/api/data2',
];

$chs = [];
foreach ($urls as $url) {
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    // 共有ハンドルをバインドします
    curl_setopt($ch, CURLOPT_SHARE, $sh);
    $chs[] = $ch;
}

// 初期化 multi handle
$mh = curl_multi_init();

// すべてのリクエストを追加します multi handle
foreach ($chs as $ch) {
    curl_multi_add_handle($mh, $ch);
}

// すべてのリクエストを実行します
$running = null;
do {
    curl_multi_exec($mh, $running);
    curl_multi_select($mh);
} while ($running > 0);

// 結果を取得します
foreach ($chs as $ch) {
    $content = curl_multi_getcontent($ch);
    echo "応答コンテンツ:\n" . $content . "\n\n";
    curl_multi_remove_handle($mh, $ch);
    curl_close($ch);
}

// 掃除
curl_share_close($sh);
curl_multi_close($mh);
?>

注意すべきこと

  1. 共有ロックタイプの制限:一度に1つのロックタイプのみを設定できます( curl_lock_data_cookiecurl_lock_data_dnsなど)。 curl_share_setoptは、複数のタイプを設定するときに複数回呼び出す必要があります。

  2. スレッドの安全性の問題:Curl_shareはC言語のマルチスレッドシナリオで使用されていますが、PHP自体はスレッドセーフではないため、この関数は主に同時性のリソース最適化( curl_multi_*など)をシミュレートするために使用されます。

  3. エラー処理:実際の開発では、 curl_errnoおよびcurl_errorチェックを追加して、リクエストが正常に実行されることを確認する必要があります。

まとめ

curl_share_initは、マルチリクエストシナリオでパフォーマンスを大幅に最適化できる強力なツールです。複数のカール要求間でリソースを共有することにより、ネットワーク要求のオーバーヘッドを削減するだけでなく、システムの全体的な効率を向上させます。 PHPのcurl_multiと組み合わせて、高性能の同時システムのための強固な基盤を築くことができます。

サードパーティのインターフェイスに接続するか、効率的なクローラーシステムを構築する必要がある場合は、 curl_shareによってもたらされる最適化効果を試すこともできます。