PHPのCurlライブラリを使用してネットワークリクエストを行う場合、 curl_share_init()関数を使用して共有ハンドルを初期化して、複数のCurlセッションがDNSキャッシュ、Cookieなどのリソースを共有できるようにします。ただし、多くの開発者は、 curl_share_init()を使用する際に障害の問題を共有する場合があります。これは、リソースの競合、誤解、または基礎となるライブラリの問題(libcurl)に関連することがよくあります。
この記事では、2つのデバッグツールであるcurl_error()とcurl_errno()を介してcurl_share_initによって引き起こされる共有の障害の問題を見つけて解決する方法を理解します。
curl_share_init()は、共有ハンドルを作成するために使用されます。これは、通常、 curl_share_setopt()と併用して共有されるリソースのタイプを定義します。最後に、 curl_share_close()を使用してハンドルをリリースする必要があります。
簡単な例:
$sh = curl_share_init();
curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_COOKIE);
ただし、誤って構成または使用されている場合、一部の共有操作が失敗する可能性があり、要求の例外、データの混乱、さらにはクラッシュとして顕在化します。
障害の一般的な原因は次のとおりです。
異なるスレッドで同じカールハンドルを使用します。
共有ハンドルまたはハンドルを繰り返し繰り返します。
セット共有タイプ(Cookie、DNSなど)は、下部ではサポートされていません。
libcurlバージョンは互換性がありません。
特定のエラーを見つけるには、 curl_error()とcurl_errno()を使用する必要があります。
これらの2つの関数は、カールエラーデバッグの中核です。
curl_error($ ch)最後のCurl操作のエラーメッセージ(文字列形式)を返します。
curl_errno($ ch)最後のCurl操作のエラーコード(数値形式)を返します。
それらは通常一緒に使用されます:
$ch = curl_init('https://m66.net/api/test');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
if ($result === false) {
echo 'cURL Error Code: ' . curl_errno($ch) . "\n";
echo 'cURL Error Message: ' . curl_error($ch) . "\n";
} else {
echo 'Request successful: ' . $result;
}
curl_close($ch);
共有ハンドルの場合:
$sh = curl_share_init();
if ($sh === false) {
die("Failed to initialize curl share handle.\n");
}
$setopt_result = curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_COOKIE);
if ($setopt_result === false) {
echo "Failed to set share option.\n";
}
$ch = curl_init('https://m66.net/api/test');
curl_setopt($ch, CURLOPT_SHARE, $sh);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
if ($result === false) {
echo 'cURL Error Code: ' . curl_errno($ch) . "\n";
echo 'cURL Error Message: ' . curl_error($ch) . "\n";
} else {
echo 'Request successful: ' . $result;
}
curl_close($ch);
curl_share_close($sh);
エラーコード | 一般的な理由 |
---|---|
1 | curle_unsupported_protocol |
3 | curle_url_malformat |
5 | curle_couldnt_resolve_proxy |
6 | curle_couldnt_resolve_host |
7 | curle_couldnt_connect |
23 | curle_write_error |
43 | curle_bad_function_argument |
81 | curle_share_in_use |
curle_share_in_useの場合、現在の共有ハンドルが別のハンドルで使用されており、同時に構成またはリリースできないことを意味します。コードロジックを確認する必要があります。
1 ?? libcurlバージョンがサポートされていることを確認してください。Curl_version ()を使用して、現在サポートされている機能を確認できます。
2 ??問題の範囲を分離するには、最初に単一のカールハンドルを使用してテストし、共有ハンドルを導入して、それが共有によって引き起こされる問題であることを確認します。
3 ?? curl_error()およびcurl_errno()を使用して、 curl_exec()の直後に詳細なエラーを取得する必要があります。
4 ?? curlopt_verboseを介して詳細なログを有効にします:
curl_setopt($ch, CURLOPT_VERBOSE, true);
5 ?? libcurlがスレッドセーフコンパイルされていない限り、スレッドの安全性を確認してください。複数のスレッドでハンドルを共有しないでください。