現在の位置: ホーム> 最新記事一覧> 複数のハンドルがcurl_share_init関数を介して同じcurl_shareオブジェクトを共有したときに発生する可能性のあるスレッド安全性の問題を解決する方法は?

複数のハンドルがcurl_share_init関数を介して同じcurl_shareオブジェクトを共有したときに発生する可能性のあるスレッド安全性の問題を解決する方法は?

M66 2025-07-18

PHPでは、HTTPリクエストにCurlライブラリを使用する場合、複数のCurlハンドルが同じcurl_shareオブジェクトを共有する状況に遭遇する場合があります。特に、同時リクエストまたはマルチスレッド環境では、共有リソースが正しく処理されない場合、スレッドの安全性の問題が発生する場合があります。この記事では、この問題をcurl_share_init関数で解決し、同じcurl_shareオブジェクトを共有するときに複数のハンドルが正しく機能することを確認します。

curlとcurl_shareとは何ですか?

Curlは、サーバーと他のサーバー間のデータ転送のための非常に強力なPHP拡張です。複数のプロトコル(HTTP、FTP、SMTPなど)をサポートし、豊富な構成オプションを備えています。同時HTTPリクエストシナリオでは、CURLはCURL_MULTI_*関数を提供して、複数のリクエストを管理します。

Curl_shareは、複数のCurlハンドルが同じリソース(Cookie、DNS、認証情報など)を共有できるようにするメカニズムです。 curl_share_init関数を使用することにより、共有オブジェクトを初期化し、複数のCurlハンドルをこのオブジェクトのデータを共有できます。

スレッドの安全性の問題

特にマルチスレッド環境で複数のカールハンドルが同時に実行されると、同じ共有リソースに同時にアクセスおよび変更される場合があります。これらのリソースに正しいスレッド同期メカニズムがない場合、スレッドの安全性の問題が発生し、要求の障害または誤ったデータが返されます。

たとえば、同じcurl_shareオブジェクトを使用して同時にCookieを共有する2つのCurl要求があるとします。スレッドロックメカニズムなしでは、1つの要求が共有リソースを変更する場合、もう1つの要求は読み取り時に一貫性のないデータを取得できます。

curl_share_initを使用してスレッドの安全性の問題を解決する方法は?

curl_share_init関数は、共有オブジェクトを初期化し、複数のcurlハンドルが特定のリソースを共有できるcurl_shareリソースを返すために使用されます。スレッドの安全性の問題を回避するために、 curl_share_setoptを使用して適切な共有オプションを設定して、各Curlハンドルが競合しないことを確認できます。

curl_share_initを使用してスレッドの安全性の問題を解決する簡単な例を次に示します。

 <?php
// 共有を作成します cURL 物体
$share = curl_share_init();

// 共有オプションを設定します
curl_share_setopt($share, CURLSHOPT_SHARE, CURLSH_COOKIE);  // 共有 Cookie
curl_share_setopt($share, CURLSHOPT_SHARE, CURLSH_SSL_SESSION); // 共有 SSL セッション

// 2つを初期化します cURL ハンドル
$ch1 = curl_init();
$ch2 = curl_init();

// 設定 cURL ハンドル选项
curl_setopt($ch1, CURLOPT_URL, 'https://m66.net/path/to/resource1');
curl_setopt($ch2, CURLOPT_URL, 'https://m66.net/path/to/resource2');

// 绑定共有物体
curl_setopt($ch1, CURLOPT_SHARE, $share);
curl_setopt($ch2, CURLOPT_SHARE, $share);

// 埋め込む cURL 聞く
$response1 = curl_exec($ch1);
$response2 = curl_exec($ch2);

// エラーを確認してください
if(curl_errno($ch1)) {
    echo 'Error with first request: ' . curl_error($ch1);
}
if(curl_errno($ch2)) {
    echo 'Error with second request: ' . curl_error($ch2);
}

// 閉鎖 cURL ハンドル
curl_close($ch1);
curl_close($ch2);

// 释放共有物体
curl_share_close($share);
?>

コードを説明してください

  1. curl_share_init :リソースを共有するために、複数のcurlハンドルの共有オブジェクト$ shareを初期化します。

  2. curl_share_setopt :共有オプションを設定します。ここでは、共有Cookie( curlsh_cookie )とSSLセッション( curlsh_ssl_session )を設定して、複数のリクエストが同じCookieとSSLセッション情報を共有できるようにします。

  3. curl_setopt :各curlハンドルを構成し、共有オブジェクト$共有を指定して、リクエストを実行するときに同じリソースを共有するようにします。

  4. リクエストを実行するcurl_execを使用して2つのリクエストを実行します。共有オブジェクトを通じて、Curlは両方のリクエストで共有リソースを管理して、スレッドの安全性を確保します。

  5. 閉じるリソース:リクエストが完了したら、カールハンドルを閉じて共有オブジェクトをリリースして、リソースの漏れを避けます。