Curlは、複数の非同期HTTP要求を行う際のPHPの非常に強力なツールです。 curl_multi_*関数を使用すると、開発者は効率を向上させるために複数の要求を同時に開始できます。 curl_multi_close関数は、複数のCurlセッションを閉じるために使用されますが、非同期リクエストを行うときにどのように応答の順序を確保しますか? curl_multi_execは複数のリクエストに対して回答を返す場合があり、これらの応答が完了する順序は、それらが要求される順序とは異なる場合があるためです。
この記事では、非同期リクエストの結果がcurl_multi_closeを使用するときにリクエストの順序を維持する方法を詳細に説明します。
curl_multi_*一連の関数は、同時リクエストを通じてパフォーマンスを改善する方法を提供します。一般的に使用されるいくつかの関数には次のものがあります。
curl_multi_init() :curlハンドルを初期化し、Curlリソースプールを作成します。
curl_multi_add_handle() :複数のCurl要求プールにカールハンドルを追加します。
curl_multi_exec() :複数のCurl要求を実行します。
curl_multi_getContent() :各リクエストの応答コンテンツを取得します。
curl_multi_close() :curl要求プールを閉じてリソースをリリースします。
これらの機能は、しばしば非同期リクエストを実行するために一緒に使用され、パフォーマンスが向上します。ただし、応答の完了順序はリクエストの順序とは異なる場合があるため、応答結果の順序が重要な問題になることを確認する方法があります。
非同期リクエストを行うとき、 curl_multi_execは、バックグラウンドで複数のリクエストを同時に開始し、すべてのリクエストが完了するのを待ちます。ただし、これらの要求の完了時間は予測不可能であるため、応答命令が中断される可能性があります。
結果が順番に処理されるようにするには、要求と応答の間のマッピング関係を記録するために何らかのメカニズムを使用する必要があります。一般的な慣行は、連想配列を使用することです。具体的には、開発者は各要求に対して一意の識別子を設定し、応答を受信したときにこの識別子に従って結果を正しく並べ替えることができます。
実装の例は次のとおりです。
<?php
// 要求するURLリスト
$urls = [
'https://gitbox.net/api/data1',
'https://gitbox.net/api/data2',
'https://gitbox.net/api/data3'
];
// 初期化 cURL multi ハンドル
$mh = curl_multi_init();
// 聞くハンドル数组
$curl_handles = [];
$responses = [];
$index = 0;
// リクエストごとに作成します cURL ハンドル并添加到 multi ハンドル中
foreach ($urls as $url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
// 各リクエストのインデックスを記録します,応答が順番に処理されるように
curl_multi_add_handle($mh, $ch);
// 将ハンドル与索引关联
$curl_handles[(string)$ch] = $index++;
}
// すべてを実行します cURL 聞く
$running = null;
do {
curl_multi_exec($mh, $running);
curl_multi_select($mh); // データが返されるまでプログラムを待ってください
} while ($running > 0);
// 读取每个聞く的响应,并按聞く的顺序保存结果
foreach ($curl_handles as $ch => $index) {
$response = curl_multi_getcontent($ch);
$responses[$index] = $response; // インデックスごとに応答を保存します
curl_multi_remove_handle($mh, $ch); // 移除ハンドル
curl_close($ch); // 关闭每个ハンドル
}
// 最後の終わり multi ハンドル
curl_multi_close($mh);
// 出力応答結果,确保按照聞く顺序输出
foreach ($responses as $response) {
echo $response . PHP_EOL;
}
?>
上記のコードでは、最初にカールマルチハンドルを初期化し、各URLのカールハンドルを作成します。応答が順番に返されるようにするために、各Curlハンドルをリクエストリストのインデックスに関連付ける連想配列$ curl_handlesを使用します。
すべての要求が完了したら、この連想配列を反復し、各応答をインデックスに従って$ resesアレイに保存し、応答の順序を確保します。
すべてのリクエストがcurl_multi_execを使用して実行されると、実行中のパラメーターが使用されて、まだ実行されているリクエストの数を示します。 curl_multi_selectは、リクエストが完了するまでデータが返されないときにプログラムをブロックし、CPUリソースを無駄にしないようにします。
最後に、 curl_multi_remove_handleとcurl_closeを使用してすべてのCurlハンドルを閉じ、 curl_multi_closeを使用して複数のCurlハンドルを閉じて関連リソースを解放します。
連想配列を合理的に使用することにより、非同期リクエストを実行するときに、応答結果がリクエストの順に返されるようにすることができます。 PHPで非同期リクエストにcurl_multi_*一連の関数を使用する場合、特に複数のインターフェイスから応答を処理する場合は、順序を維持することが重要です。この例を通じて、PHPで非同期リクエストを行い、順序を確保し、プログラムのパフォーマンスと安定性を改善する方法をよりよく理解できます。