パフォーマンスの最適化は、PHPでネットワークリクエストにCurlを使用する場合に開発者が非常に懸念している側面です。 Curl自体は接続の再利用をサポートします。これにより、頻繁なTCP接続確立によって引き起こされるオーバーヘッドを減らすことができます。マルチレクエストシナリオの効率をさらに向上させるために、PHP Curlはcurl_share_init()関数を提供します。これは、DNSキャッシュ、接続ハンドルなど、複数のCurlハンドル間でいくつかのリソースを共有するために使用されます。長い接続管理でどのような役割を果たすことができますか?この記事では、この問題を実践の観点から深く分析します。
curl_share_init()は、PHPのCurl拡張機能によって提供される関数です。このハンドルは、複数のカール要求間でリソースを共有することができ、それにより全体的なパフォーマンスが向上します。 curlopt_shareオプションのcurl_setopt()関数で使用すると、複数のCurl要求を同じ共有ハンドルにバインドできます。
サンプルコードは次のとおりです。
$sh = curl_share_init();
curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_DNS);
$ch1 = curl_init();
curl_setopt($ch1, CURLOPT_URL, "https://m66.net/api/endpoint1");
curl_setopt($ch1, CURLOPT_SHARE, $sh);
$ch2 = curl_init();
curl_setopt($ch2, CURLOPT_URL, "https://m66.net/api/endpoint2");
curl_setopt($ch2, CURLOPT_SHARE, $sh);
接続再利用とは、同じ基礎となる接続をマルチプレックスする複数の要求を指します(通常、TCPまたはHTTP/1.1の場合は保持します)。デフォルトでは、Curlには接続マルチプレックスのメカニズムが搭載されていますが、そのスコープは単一のCurlハンドルまたは同じマルチハンドルの要求に限定されています。 curl_share_init()の当初の意図は、複数の独立したCurlハンドルが接続情報を共有できるようにすることです。
しかし、ポイントは、Curl自体の接続マルチプレックス機能は共有ハンドルを介して実装されるのではなく、マルチカールインターフェイス(curl_multi_initなど)に依存して接続プールを管理します。
言い換えると:
curl_share_init()は、主にDNSキャッシュ、SSLセッション、Cookie、その他のリソースを共有するために使用されます。
接続ハンドルの多重化を直接サポートしません(curl_lock_data_connectはPHPでサポートされていません)。
真の接続の多重化を実現するには、 curl_multi_*シリーズの関数を使用する必要があります。
したがって、 curl_share_init()は、長い接続の多重化のために特異的に設計されていないため、マルチプレックスに関連する役割は限られています。
curl_share_init()は接続プールを直接管理していませんが、長い接続システムではまだ価値があります。
DNSキャッシュマルチプレックス:DNSクエリは、複数の要求が同じホストにアクセスする場合の時間のかかる操作です。 curl_lock_data_dnsを介して、複数のハンドルが解像度の結果を共有し、DNSクエリの数を減らし、要求プロセスをスピードアップできます。
SSLセッションキャッシュマルチプレックス: curl_lock_data_ssl_sessionが有効になると、SSLセッションは複数のHTTPS要求間で共有でき、繰り返しの握手を回避し、TLS接続時間を短縮できます。
Cookie Management : curl_lock_data_cookieを使用して、複数のリクエスト間でCookieデータを共有し、ログインの継続を実現できます。
接続ハンドルの再利用に直接参加することはできませんが、長い接続ポリシーをサポートする周辺メカニズムのパフォーマンスを改善する上で重要な役割を果たしています(DNSクエリやTLSハンドシェイクオーバーヘッドの削減など)。
curl_share_init()自体は、長い接続の管理または再利用について責任を負いません。その目的は、主に、DNSキャッシュ、SSLセッション、複数のCurl要求間でCookieなどのリソースを共有することに焦点を当てています。効率的な長い接続の多重化を実現するには、 Curl_multi_*シリーズインターフェイスの使用を優先する必要があります。共同使用の場合、 curl_share_init()は、接続の多重化ポリシーのサポートサポートを提供し、全体的な要求効率を改善できます。
したがって、高電流または高性能PHPネットワーク通信プログラムを構築する場合、 curl_share_init()は価値のあるツールですが、長い接続マルチプレックスのコアツールではなく、最適化方法の補助サポート役割です。