PHPでCurl共有ハンドル機能( curl_share_init() )を使用する場合、開発者が共有リソースを適切にリリースできない場合、リソースの漏れの問題を引き起こす可能性が非常に高く、サーバーのパフォーマンスや安定性さえ影響します。この記事では、curl_share_init()とcurl_share_close()の正しい使用法に焦点を当て、開発者が潜在的なリスクを回避できるようにします。
curl_share_init()は、Curl Shareハンドルを初期化するためにPHPによって提供される関数です。このハンドルは、パフォーマンスとリソースの再利用を改善するために、複数のカールセッション間でDNSキャッシュ、Cookieなどの情報を共有するために使用できます。
共有ハンドルを使用するための典型的なプロセスは次のとおりです。
$sh = curl_share_init();
curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_COOKIE);
共有ハンドルは、 curl_setopt()を介して複数のcurl要求に関連付けることができます。
$ch = curl_init('https://www.m66.net/api/data');
curl_setopt($ch, CURLOPT_SHARE, $sh);
curl_exec($ch);
curl_close($ch);
問題は、多くの開発者がcurl_share_close()を呼び出して共有ハンドルの使用を完了した後にリソースをリリースすることを忘れていることです。
// エラーの例:共有ハンドルは閉じていません
$sh = curl_share_init();
// ... 一連の操作
// 忘れる curl_share_close($sh);
この過失は、サーバー内のリソース(メモリ、DNSキャッシュなど)内部のリソースの継続的な使用を引き起こし、最終的に「メモリリーク」警告、パフォーマンスの劣化を引き起こし、オペレーティングシステムごとにPHP-FPMワーカーを強制的に終了する可能性があります。
共有ハンドルが使用された後、常にcurl_share_close()を呼び出してリソースを解放する必要があります。
$sh = curl_share_init();
curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_COOKIE);
// 複数のリクエストを実行します
foreach ($urls as $url) {
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_SHARE, $sh);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
}
curl_share_close($sh); // 共有リソースを無料で提供します
これは、通常のcurl_close()に似ています。重要なのは、開発者が共有ハンドルのリリースを見逃せないことです。
Curl共有ハンドルは、単一プロセスになるように設計されており、複数のスレッドまたは複数のプロセス間で共有できません。これは、PHP-FPMマルチプロセスモデルでは、各子プロセスが独自の共有ハンドルを管理する必要があることを意味します。
共有ハンドルがCURL要求に関連付けられたら、その共有オプションを変更することはできません。そうしないと、内部状態の例外が提起される場合があります。例えば:
$sh = curl_share_init();
curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_DNS);
// 関連性の前に設定するのは正しいです,後で変更しないでください
共有DNSキャッシュは、解像度の結果が「古くなっている」とする可能性があります。合理的なTTLは実際のニーズに応じて設定する必要があり、キャッシュは定期的にクリーニングするか、共有ハンドルを再活性化する必要があります。
HTTP要求クラスをカプセル化すると、クラスデストラクタまたはシャットダウン機能で共有ハンドルプールが均一に導入およびリリースされます。
Register_shutdown_function()登録およびクリーニングロジックと組み合わせて。
共有を使用してログを追加するか、情報をデバッグして、吊り下げリソースがリリースされないようにします。
高い並行性環境の場合、共有のパフォーマンスの改善が重要であるかどうかを評価することをお勧めします。そうしないと、デフォルトのハンドルを使用する方が簡単で安全です。
curl_share_init()は、Curlのパフォーマンスを改善するための重要なツールですが、リソース管理の責任も伴います。開発者は、使用後に常にcurl_share_close()を呼び出してリソースをリリースし、共有ハンドルのライフサイクルが明確で制御されていることを確認する必要があります。このようにのみ、共有によってもたらされるパフォーマンスの利点を享受しながら、リソースの不必要な無駄と潜在的なリスクを避けることができます。