大規模なHTTPリクエストを作成するとき、PHPのCurlライブラリは、同時リクエストを行い、パフォーマンスを改善するのに役立つ非常に強力なツールです。ただし、接続を効率的に管理する必要があるため、複数のリクエストを配置するだけでは、必ずしも最適なパフォーマンスにつながるとは限りません。より効率的な接続最適化を実現するために、 curl_upkeep()およびcurl_multi_select()関数を使用して、接続のオーバーヘッドを減らすことができます。
curl_upkeep() :この関数は、主に初期化されたCurl接続を管理するために使用され、使用時に有効であることを保証し、接続の再利用を維持してリソースを節約し、複製接続の確立プロセスを減らします。
curl_multi_select() :この関数は、 curl_multi_exec()で使用されます。その機能は、少なくとも1つのカールハンドルが準備が整うのを待つことをブロックすることであり、多数の同時リクエストの効率的な管理に適しています。
これら2つの機能を組み合わせることにより、各要求中の遅延を大幅に削減し、複数のリクエスト間の同時処理効率を改善できます。
curl_upkeep()およびcurl_multi_select()の使用方法を紹介する前に、基本的なマルチタスクの実行方法を確認しましょう。次のコードは、curl_multi_init()とcurl_multi_exec()を使用して同時リクエストを行う方法を示しています。
// 複数を初期化しますcURLハンドル
$mh = curl_multi_init();
$handles = [];
$urls = [
'https://m66.net/api/data1',
'https://m66.net/api/data2',
'https://m66.net/api/data3'
];
// リクエストごとに1つを作成しますcURLハンドル
foreach ($urls as $url) {
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_multi_add_handle($mh, $ch);
$handles[] = $ch;
}
// マルチタスクリクエストを実行します
do {
$status = curl_multi_exec($mh, $active);
if ($active) {
curl_multi_select($mh); // アクティブなリクエストが発生するまでブロックします
}
} while ($active);
// 結果を処理してクリーニングします
foreach ($handles as $ch) {
$response = curl_multi_getcontent($ch);
echo $response;
curl_multi_remove_handle($mh, $ch);
curl_close($ch);
}
curl_multi_close($mh);
このコードマルチタスクは、 curl_multi_exec()を介して要求し、 curl_multi_select()を呼び出して、ループが毎回アクティブな接続を待つため、不必要なCPUリソースの使用を回避します。
頻繁な確立と接続の破壊を避けるために、 curl_upkeep()関数を介して接続の多重化を実装できます。 PHPはcurl_upkeep()関数を直接提供していませんが、 curl_multi_*関数の組み合わせを使用して同様の関数を実現できます。具体的には、リクエストするたびに接続を再現する代わりに、これらの接続を管理するために永続的な接続プールを使用します。
接続プールの初期化:最初にカールハンドルプールを作成すると、各リクエストの新しい接続を初期化する代わりに、プール内の接続が再利用されます。
接続の多重化:マルチタスク要求の実行中に、接続プールの接続を確認できます。自由接続がある場合は、再利用できます。
// 永続的な接続プールを作成します
$mh = curl_multi_init();
$handles = [];
$connectionPool = [];
// リクエストURLs
$urls = [
'https://m66.net/api/data1',
'https://m66.net/api/data2',
'https://m66.net/api/data3'
];
// 初期化cURLハンドル并存储
foreach ($urls as $url) {
if (empty($connectionPool[$url])) {
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$connectionPool[$url] = $ch; // 接続プールに新しい接続を保存します
} else {
$ch = $connectionPool[$url]; // 接続プールで既存の接続を使用します
}
curl_multi_add_handle($mh, $ch);
$handles[] = $ch;
}
// マルチタスクリクエストを実行します
do {
$status = curl_multi_exec($mh, $active);
if ($active) {
curl_multi_select($mh); // アクティブなリクエストが発生するまでブロックします
}
} while ($active);
// 結果を処理してクリーニングします
foreach ($handles as $ch) {
$response = curl_multi_getcontent($ch);
echo $response;
curl_multi_remove_handle($mh, $ch);
// ここでは、接続を閉じません,接続プールで多重化を維持します
}
curl_multi_close($mh);
上記のコードでは、マルチタスクリクエストが実行されると、プールの接続で単純な接続プールConnectionPoolを作成し、多重化します。これにより、特に複数のリクエストが同じドメイン名を指している場合、接続効率を大幅に改善できます。
curl_upkeep() (接続プール管理)とcurl_multi_select() (アクティブリクエストをブロックして待機)を組み合わせることにより、PHPのCurlマルチタスク要求を最適化して、システム全体のパフォーマンスを改善できます。接続プーリングメカニズムは、接続の頻繁な作成と破壊を効果的に削減し、システムリソースを節約しますが、 curl_multi_select()は効率的な同時実行を保証します。
このようにして、大量のHTTP要求を処理するときに接続をより効率的に管理し、プログラムの応答速度を改善し、遅延を削減し、より高いパフォーマンスを達成できます。