PHPで効率的なネットワークリクエストを作成する場合、Curlを使用してHTTP要求を開始する必要があることがよくあります。ただし、特定のリソース(Cookie、ファイル記述子など)を複数のCurlリクエスト間で共有する必要がある場合、従来のCurlリクエストはリソースの競争と同期の問題が発生する場合があります。この問題を解決するために、PHPはcurl_share_init関数を提供します。これにより、複数のCurlハンドル間でリソースを共有できます。この記事では、 curl_share_initを使用して複数のPHPサブプロセスで共有リソース同期を実現する方法について詳しく説明します。
curl_share_initは、共有Curlハンドルを作成するためのPHPの関数です。リソースを共有するための複数のカール要求に役立ちます。共有リソースは、Cookie、ファイル記述子、DNSキャッシュなどです。共有リソースを使用すると、各Curl要求が同じ情報を繰り返し読み込むことができず、プログラムの効率が向上します。
Curlの共有リソースは、高い並行性シナリオで非常に役立ちます。たとえば、複数のCurl要求がすべて同じWebサイトへのアクセスを必要とする場合、クッキーを共有することにより、複数のリクエストのセッションステータスをシミュレートでき、リクエストするたびにログイン情報を再獲得することができます。さらに、共有DNSキャッシュを使用すると、頻繁なDNSクエリを減らし、パフォーマンスを向上させることができます。
curl_share_initは、複数のCurlハンドルに関連付けられる共有リソースハンドルを作成するために使用されます。使用するための基本的な手順は次のとおりです。
curl_share_initを使用して、共有ハンドルを作成します。
共有ハンドルを構成して、特定のリソース(Cookie、DNS、ファイル記述子など)を共有します。
共有ハンドルを複数のカールリクエストに関連付けます。
Curlリクエストを実行し、リソースを共有していることを確認してください。
最後に、共有ハンドルとカールハンドルをリリースします。
<?php
// 共有ハンドルを初期化します
$share = curl_share_init();
// 共有リソースを構成します(例えば cookies)
curl_share_setopt($share, CURLSHOPT_SHARE, CURL_LOCK_DATA_COOKIE);
// 複数を作成します cURL ハンドル
$curl1 = curl_init('http://m66.net/api/endpoint1');
$curl2 = curl_init('http://m66.net/api/endpoint2');
// 将共享ハンドル与 cURL ハンドル关联
curl_setopt($curl1, CURLOPT_SHARE, $share);
curl_setopt($curl2, CURLOPT_SHARE, $share);
// その他をセットアップします cURL オプション
curl_setopt($curl1, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl2, CURLOPT_RETURNTRANSFER, true);
// リクエストを実行します
$response1 = curl_exec($curl1);
$response2 = curl_exec($curl2);
// 出力結果
echo "Response 1: " . $response1 . "\n";
echo "Response 2: " . $response2 . "\n";
// 無料のリソース
curl_share_close($share);
curl_close($curl1);
curl_close($curl2);
?>
上記のコードでは、まずcurl_share_init $ shareを使用して共有ハンドルを作成し、次にcurl_share_setoptを使用して共有ハンドルを構成してCookiesデータを共有します。次に、2つのCurlハンドル$ curl1と$ curl2を作成し、 Curlopt_shareオプションを使用して共有ハンドルをそれらに関連付けます。リクエストを実行した後、カールハンドルと共有ハンドルを閉じました。
マルチプロセス環境では、特にPHPのPCNTL_FORKを使用して複数の子プロセスを作成する場合は、 curl_share_initを使用してリソースを共有することもできます。各子プロセスは同じリソースを共有することができ、それにより、リソースの初期化の重複を回避し、リソースの同期を可能にします。
<?php
// 共有ハンドルを初期化します
$share = curl_share_init();
curl_share_setopt($share, CURLSHOPT_SHARE, CURL_LOCK_DATA_COOKIE);
// 作成する cURL ハンドル
$curl1 = curl_init('http://m66.net/api/endpoint1');
$curl2 = curl_init('http://m66.net/api/endpoint2');
// 将共享ハンドル与 cURL ハンドル关联
curl_setopt($curl1, CURLOPT_SHARE, $share);
curl_setopt($curl2, CURLOPT_SHARE, $share);
// 作成するサブプロセス
$pid = pcntl_fork();
if ($pid == -1) {
// エラー処理
die("Fork failed!");
} elseif ($pid == 0) {
// サブプロセス 1
curl_setopt($curl1, CURLOPT_RETURNTRANSFER, true);
$response1 = curl_exec($curl1);
echo "Child Process 1 Response: " . $response1 . "\n";
curl_close($curl1);
} else {
// 主なプロセス
curl_setopt($curl2, CURLOPT_RETURNTRANSFER, true);
$response2 = curl_exec($curl2);
echo "Parent Process Response: " . $response2 . "\n";
curl_close($curl2);
// 等待サブプロセス结束
pcntl_wait($status);
}
// 共有リソースを無料で提供します
curl_share_close($share);
?>
この例では、まず共有リソースハンドル$ shareを作成し、共有Cookieを設定します。次に、 PCNTL_FORKを使用して子プロセスを作成しました。子プロセスでは、1つのカール要求を個別に実行しますが、メインプロセスは別のリクエストを実行します。共有リソースを通じて、主なプロセスと子プロセスは、リソースの重複の読み込みを回避できます。
マルチプロセス環境では、各プロセスは親プロセスのファイル記述子と共有リソースをコピーして、各プロセスが独立して実行され、共有リソースへのアクセスが同期されることを確認します。
curl_share_initを使用する場合は、リクエストが完了したら、リソースを解放した後、必ず共有ハンドルを閉じてください。
スレッドはPHPでは直接サポートされていないため、マルチプロセスは並行性を実現する一般的な方法です。大規模な同時性を扱うときは、 PCNTL_FORKとCURL_SHARE_INITを組み合わせてパフォーマンスを向上させることを検討できます。
curl_share_initを使用することにより、複数のPHPチャイルドプロセスで共有リソースを同期させることができます。これは、ネットワークリクエストのパフォーマンスを改善し、重複するリソースの読み込みを削減するのに非常に役立ちます。特に、高い並行性環境では、共有リソースの合理的な使用は、不必要なオーバーヘッドを効果的に減らし、システムの効率を向上させることができます。 PCNTL_FORKとCURLを組み合わせてリソースを共有することにより、複雑な同時リクエストとリソース共有の問題をよりよく扱うことができます。