ネットワークリクエストにPHPを使用する場合、 Curlは他のサーバーHTTPと通信できる非常に一般的なライブラリです。ただし、一部のシナリオでは、複数のカールハンドル間でいくつかのリソース(Cookie、ファイル記述子など)を共有する必要がある場合があります。この時点で、 curl_share_init関数は便利です。
curl_share_init()は、共有ハンドルの初期化に使用されるPHP Curl関数です。この共有ハンドルは、複数のカールセッションで共有できるため、セッションのCookie、DNSクエリの結果、ファイル記述子などの特定のリソースを共有できます。
curl_share_init()を使用すると、複数のリクエスト間で同じリソースの繰り返しの負荷が繰り返され、パフォーマンスが向上し、システムのオーバーヘッドが削減されないようにすることができます。この関数は共有ハンドルを返し、その後、他の機能( curl_setoptなど)を介して共有ハンドルに関連するパラメーターを構成し、最後にcurl_share_closeを介して共有ハンドルをリリースできます。
<span><span><span class="hljs-variable">$share</span></span><span> = </span><span><span class="hljs-title function_ invoke__">curl_share_init</span></span><span>();
</span></span>
この関数が呼び出されると、共有ハンドル$ shareを返します。これにより、複数のカールセッション間でリソースが共有されます。このハンドルを使用して、共有リソースの動作を設定できます。
共有ハンドルが正常に初期化されたら、 curl_share_setoptを使用して、複数のセッション間で共有できるリソースを設定できます。一般的に使用される共有リソースは次のとおりです。
curlopt_share :共有されるリソースを設定するために使用されます。リソースを共有するためにCurlshopt_shareを指定したり、リソースの共有を停止するCurlshopt_unshareを指定できます。
curlshopt_share(共有Cookie) :複数のセッションが同じCookieデータを共有しています。
curlshopt_share(共有DNS) :複数のセッションが同じDNS解像度キャッシュを共有します。
curlshopt_share(共有ファイル記述子) :共有ファイル記述子。同じファイルを読み取る必要がある場合に複数のCurlセッションに適しています。
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// 共有ハンドルを初期化します</span></span><span>
</span><span><span class="hljs-variable">$share</span></span><span> = </span><span><span class="hljs-title function_ invoke__">curl_share_init</span></span><span>();
</span><span><span class="hljs-comment">// 共有リソースをセットアップします(たとえば、共有cookie)</span></span><span>
</span><span><span class="hljs-title function_ invoke__">curl_share_setopt</span></span><span>(</span><span><span class="hljs-variable">$share</span></span><span>, CURLSHOPT_SHARE, CURL_LOCK_DATA_COOKIE);
</span><span><span class="hljs-comment">// 初期化cURLハンドル1</span></span><span>
</span><span><span class="hljs-variable">$ch1</span></span><span> = </span><span><span class="hljs-title function_ invoke__">curl_init</span></span><span>();
</span><span><span class="hljs-title function_ invoke__">curl_setopt</span></span><span>(</span><span><span class="hljs-variable">$ch1</span></span><span>, CURLOPT_URL, </span><span><span class="hljs-string">'http://example.com'</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">curl_setopt</span></span><span>(</span><span><span class="hljs-variable">$ch1</span></span><span>, CURLOPT_SHARE, </span><span><span class="hljs-variable">$share</span></span><span>);
</span><span><span class="hljs-comment">// 初期化cURLハンドル2</span></span><span>
</span><span><span class="hljs-variable">$ch2</span></span><span> = </span><span><span class="hljs-title function_ invoke__">curl_init</span></span><span>();
</span><span><span class="hljs-title function_ invoke__">curl_setopt</span></span><span>(</span><span><span class="hljs-variable">$ch2</span></span><span>, CURLOPT_URL, </span><span><span class="hljs-string">'http://example.org'</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">curl_setopt</span></span><span>(</span><span><span class="hljs-variable">$ch2</span></span><span>, CURLOPT_SHARE, </span><span><span class="hljs-variable">$share</span></span><span>);
</span><span><span class="hljs-comment">// 埋め込むcURL聞く</span></span><span>
</span><span><span class="hljs-title function_ invoke__">curl_exec</span></span><span>(</span><span><span class="hljs-variable">$ch1</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">curl_exec</span></span><span>(</span><span><span class="hljs-variable">$ch2</span></span><span>);
</span><span><span class="hljs-comment">// 閉鎖cURLハンドル</span></span><span>
</span><span><span class="hljs-title function_ invoke__">curl_close</span></span><span>(</span><span><span class="hljs-variable">$ch1</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">curl_close</span></span><span>(</span><span><span class="hljs-variable">$ch2</span></span><span>);
</span><span><span class="hljs-comment">// 閉鎖共享ハンドル</span></span><span>
</span><span><span class="hljs-title function_ invoke__">curl_share_close</span></span><span>(</span><span><span class="hljs-variable">$share</span></span><span>);
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>
上記の例では、共有ハンドル$ shareを初期化し、Cookieデータを共有するように構成します。次に、2つのカールハンドル$ CH1と$ CH2を作成し、両方を設定して同じ共有ハンドルを共有します。最後に、リクエストを実行し、すべてのカールハンドルと共有ハンドルを閉じます。
curl_share_initは、特に次のシナリオで、複数のCurl要求間でリソースを共有する場合に非常に便利です。
複数のリクエストでCookieを共有する:複数のHTTPリクエストを実行している場合、およびそれらのリクエストが同じセッション(ログイン後のセッション状態など)を維持する必要がある場合、Cookieを共有できます。
共有DNS解像度:複数のネットワーク要求を行い、これらのリクエストのターゲットサーバーが同じドメイン名の下にある場合、DNS共有を有効にすると、DNS解像度のオーバーヘッドを減らすことができます。
共有ファイル記述子:共有ファイル記述子は、同じファイルリソースへの複数のリクエストを読み取る必要がある場合、ファイルの読み取り効率を最適化するのに役立ちます。
同時実行:複数のカールセッションが同じ共有ハンドルを共有する場合、人種条件を避けるために、同時リクエストのロジックを処理してください。たとえば、CURLセッションでは、共有リソースに同時にアクセスでき、スレッドセーフである必要があります。
リソースの共有制限: curl_share_initはリソースを共有する機能を提供しますが、すべてのリソースを共有できるわけではありません。 Curlがサポートする共有リソースの種類を理解することが重要です。
共有ハンドルのライフサイクル:共有ハンドルは、複数のカールセッション間でリソースを共有するため、リソースが適切にリリースされるようにすべてのカールセッションが実行された後にのみ閉鎖する必要があります。
curl_share_initは、PHPのCurlに効率的なリソース共有メカニズムを提供します。特に、複数のHTTP要求間でいくつかのリソースを共有する必要があるシナリオに適しています。共有ハンドルを合理的に使用することにより、重複したワークロードを削減し、プログラムのパフォーマンスを向上させることができます。 curl_share_initの使用法を習得することは、Curl操作の柔軟性と効率を改善するのに非常に役立ちます。