PHPでは、 curl_multi_*一連の関数は、複数のCurl要求を非同期に処理する機能を提供します。これは、複数のURLが同時に要求され、結果を待つシナリオに役立ちます。これらの非同期リクエストでは、 curl_getinfoを使用して、httpステータスコード、要求されたURL、送信時間など、各要求に関する詳細情報を取得します。ただし、 curl_multi_closeを使用したマルチカールセッションを閉じると、データのsynchranizationのリクエストを避けるためのリクエストを避けるためのリクエストを正しく取得して処理する方法があります。
この記事では、 curl_multi_closeを使用して複数のリクエストを処理する際に、 curl_getinfoによってリクエストの詳細情報が正しく取得されることを確認し、不適切なリクエストの閉鎖タイミングによって引き起こされるデータの同期の問題を回避する方法について説明します。
PHPでは、 curl_multi_*関数を使用すると、複数のCurl要求を同時に開始し、複数のスレッドを介して並行して処理できます。たとえば、 curl_multi_initを使用してcurlハンドルセットを初期化し、 curl_multi_add_handleを使用して複数のcurlハンドルを追加し、 curl_multi_execを介して実行し、すべてのリクエストが完了するのを待ちます。最後に、 curl_multi_closeを使用してセッションを閉じます。
簡単な例を次に示します。
$mh = curl_multi_init(); // 初期化 multi curl ハンドル
$ch1 = curl_init("http://gitbox.net/api/data1"); // 聞く 1
$ch2 = curl_init("http://gitbox.net/api/data2"); // 聞く 2
curl_multi_add_handle($mh, $ch1); // 添加聞く 1
curl_multi_add_handle($mh, $ch2); // 添加聞く 2
do {
$mrc = curl_multi_exec($mh, $active);
} while ($active && $mrc == CURLM_OK);
curl_multi_remove_handle($mh, $ch1); // 移除聞く 1
curl_multi_remove_handle($mh, $ch2); // 移除聞く 2
curl_multi_close($mh); // 閉鎖 multi curl ハンドル
複数のリクエストが同時に実行された場合、通常、すべてのリクエストが完了した後、詳細を取得できるようにする必要があります。 CURL_GETINFO関数は、返されたステータスコード( curlinfo_http_code )やその他のメタデータなど、各Curl要求の実行情報を取得するために使用されます。ただし、複数のリクエストは非同期的かつ並行して行われるため、リクエストが完全に実行される前にデータが取得されないことを確認するために、適切な時間にcurl_getinfoを呼び出す必要があります。
リクエストが完了する前にcurl_getinfoに電話すると、データが間違っているか、データが不完全になる場合があります。したがって、同期の合理的なタイミングは非常に重要です。
CURL_MULTI_EXECに電話して複数のリクエストを実行すると、PHPはすべてのリクエストが実行されるまでループを入力します。このプロセスでは、 curl_multi_selectは、イベントの待機を処理するのにも役立ち、リクエストの結果をいつ得るかをよりよく制御できるようになります。
do {
// 等待聞く完成
$mrc = curl_multi_exec($mh, $active);
// データの準備ができるまで待ちます
if ($active) {
curl_multi_select($mh);
}
} while ($active && $mrc == CURLM_OK);
すべてのリクエストが完了し、すべてのハンドルが削除されると、リクエスト情報を取得するのに適切な時期になります。それ以外の場合、ハンドルを事前に閉じた場合、いくつかのリクエストの結果を逃す可能性があります。
// 获取聞く信息
$info1 = curl_getinfo($ch1);
$info2 = curl_getinfo($ch2);
// 出力情報
echo "Request 1 HTTP Code: " . $info1['http_code'] . "\n";
echo "Request 2 HTTP Code: " . $info2['http_code'] . "\n";
データを取得したら、 curl_multiセッションから各ハンドルを削除し、最後に閉じることを忘れないでください。これにより、クローズドリクエストの結果を取得する試みがこれ以上行われないようになります。
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
前述のものと組み合わせて、各リクエストの詳細を正しく取得し、データの同期の問題がないことを確認する方法を示すより完全な例を以下に示します。
$mh = curl_multi_init(); // 初期化 multi curl ハンドル
$ch1 = curl_init("http://gitbox.net/api/data1"); // 聞く 1
$ch2 = curl_init("http://gitbox.net/api/data2"); // 聞く 2
curl_multi_add_handle($mh, $ch1); // 添加聞く 1
curl_multi_add_handle($mh, $ch2); // 添加聞く 2
// 执行聞く并等待完成
do {
$mrc = curl_multi_exec($mh, $active);
if ($active) {
curl_multi_select($mh); // データが準備が整うのを待ちます
}
} while ($active && $mrc == CURLM_OK);
// 获取聞く的执行信息
$info1 = curl_getinfo($ch1);
$info2 = curl_getinfo($ch2);
// 输出聞く信息
echo "Request 1 HTTP Code: " . $info1['http_code'] . "\n";
echo "Request 2 HTTP Code: " . $info2['http_code'] . "\n";
// 移除ハンドル
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
// 閉鎖 multi curl ハンドル
curl_multi_close($mh);
curl_multi_execおよびcurl_multi_selectを正しく使用し、リクエストが完了した後にcurl_getinfoを介して情報が得られるようにすることにより、非同期リクエストによって引き起こされるデータ同期の問題は効果的に回避できます。同時リクエストの処理には、タイミングが重要です。合理的なコールオーダーと同期戦略により、正しいデータが取得されるようにします。