開発では、多くの場合、複数のサーバーまたはAPIにHTTPリクエストを開始する必要があります。従来のシングルスレッド方法に従って1つずつリクエストする場合、それは遅くなるだけでなく、サーバーのリソースも無駄にします。 PHPはCurl拡張機能を提供します。ここでは、 curl_multi_execおよびcurl_multi_close関数がマルチリクエストの同時処理を実装し、効率を大幅に改善できます。
この記事では、効率的な並行性処理のためにcurl_execとcurl_multi_closeを組み合わせて使用する方法を詳細に紹介し、特定の例を示します。
curl_exec() :単一のCurl要求を実行します。
curl_multi_exec() :複数のCurlハンドルを同時に実行します。
curl_multi_close() :curlバッチハンドルを閉じてリソースをリリースします。
多数のリクエストを同時に処理する必要がある場合は、各リクエストに対してCurl_execを個別に呼び出す代わりに、 curl_multi_execを使用することをお勧めします。 curl_multi_closeは、すべてのリクエストが処理された後、リソースをクリーンアップするための重要なステップです。
複数のインターフェイスを同時に要求し、応答を処理する方法を示す簡単な例を次に示します。
<?php
// 要求するURLリスト
$urls = [
"https://gitbox.net/api/data1",
"https://gitbox.net/api/data2",
"https://gitbox.net/api/data3",
];
// 複数を初期化しますcURLハンドル
$multiHandle = curl_multi_init();
$curlHandles = [];
foreach ($urls as $url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_multi_add_handle($multiHandle, $ch);
$curlHandles[] = $ch;
}
// すべてのリクエストを実行します
$running = null;
do {
$status = curl_multi_exec($multiHandle, $running);
if ($status > 0) {
// エラーが発生しました
echo "cURL error: " . curl_multi_strerror($status);
break;
}
// アクティブな接続を待っています
curl_multi_select($multiHandle);
} while ($running > 0);
// 各リクエストの応答を処理します
foreach ($curlHandles as $ch) {
$response = curl_multi_getcontent($ch);
$info = curl_getinfo($ch);
if (curl_errno($ch)) {
echo 'Request Error: ' . curl_error($ch) . PHP_EOL;
} else {
echo 'HTTP Code: ' . $info['http_code'] . PHP_EOL;
echo 'Response: ' . $response . PHP_EOL;
}
curl_multi_remove_handle($multiHandle, $ch);
curl_close($ch);
}
// 閉鎖multi handle
curl_multi_close($multiHandle);
?>
最初にcurl_multi_init()を介してマルチハンドルを作成します。
各カールを個別に設定した後、 curl_multi_add_handle()を介してマルチハンドルに追加します。
curl_multi_exec()を使用してすべてのリクエストを実行し、すべてのリクエストが完了するまでポーリングします。
curl_multi_select()は、CPUのアイドル性を低下させ、効率を向上させることができます。
リクエストが完了したら、 curl_multi_getContent()を使用して応答コンテンツを取得します。
最後に、 curl_multi_remove_handle()を使用してハンドルを削除し、 curl_multi_close()でマルチハンドルを閉じてリソースを解放してください。
同時数:1回限りのリクエストにURLが多すぎる場合は、リソースを消費しないように一度に10個のリクエストのみが送信されるなど、バッチでそれらを処理することをお勧めします。
タイムアウト処理: curlopt_timeoutまたはcurlopt_connecttimeoutを設定して、いくつかのリクエストの長期的なハングを避けることができます。
エラー処理: curl_errno()およびcurl_error()を使用して、単一の要求がエラーなしかどうかを確認します。
接続の再利用: curlopt_forbid_reuseをオンにすると、頻繁なTCP接続の作成を回避し、パフォーマンスを向上させることができます。
curl_execとcurl_multi_closeを組み合わせることにより、PHPで多数のHTTP並行要求を効率的に処理できます。この方法は、要求全体を短縮するだけでなく、サーバーの並行性機能を最大限に活用します。これは、高性能PHPアプリケーションを構築するための重要なスキルの1つです。
これらの基本を習得することで、PHPアプリケーションをより速く、より安定させることができます!