PHPでは、 curl_multi_*関数を使用して、リクエストの効率を改善するために複数のCurl要求を同時に開始します。ただし、 curl_multi_closeを呼び出して複数のCurlセッションを終了すると、関数がすべての関連するハンドルを閉じるため、リクエストの返信結果を取得することはできません。 curl_multi_closeを呼び出した後、各リクエストの返品結果を取得するには、いくつかのトリックが必要です。
この記事では、 curl_multi_closeの後にすべてのリクエストの返品結果を正しく取得する方法について説明します。
curl_multi_closeを呼び出した後、各curl要求の応答コンテンツはcurl_multi_getContentを介して取得できます。返された結果をすべて正しく取得するには、Curlセッションを閉じる前に各リクエストの結果が保持されることを確認する必要があります。
ここに完全な例があります:
<?php
// 初期化cURLハンドル
$urls = [
'https://gitbox.net/api/endpoint1',
'https://gitbox.net/api/endpoint2',
'https://gitbox.net/api/endpoint3'
];
$multiCurl = curl_multi_init();
$curlHandles = [];
// それぞれのためURL作成するcURLハンドル并添加到多重请求队列
foreach ($urls as $url) {
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 返されたコンテンツを取得します
curl_multi_add_handle($multiCurl, $ch);
$curlHandles[] = $ch;
}
// すべてのリクエストを実行します
$running = null;
do {
curl_multi_exec($multiCurl, $running);
curl_multi_select($multiCurl);
} while ($running > 0);
// 各リクエストの結果を取得します
$responses = [];
foreach ($curlHandles as $ch) {
$responses[] = curl_multi_getcontent($ch);
curl_multi_remove_handle($multiCurl, $ch); // 从多重请求队列中移除ハンドル
}
// 閉鎖cURL複数の会話
curl_multi_close($multiCurl);
// 各リクエストの返品結果を出力します
foreach ($responses as $response) {
echo $response . "\n";
}
?>
複数のリクエストハンドルを初期化します:
最初に、すべてのURLをリクエストするすべてのURLを保存する$ URLの配列を定義します。この例では、すべてのURLがgitbox.netドメイン名に置き換えられます。
次に、各URLのカールハンドル$ chを作成し、複数のカールセッションに追加します。
リクエストを実行します:
curl_multi_exec()を使用して、セッションに追加されたすべての要求を実行します。 curl_multi_select()を使用して、リクエストが完了するまでアイドル状態にならないようにします。
リクエスト結果を取得します:
すべてのリクエストが完了した後、 curl_multi_getContent($ ch)を使用して各リクエストの返品コンテンツを取得し、 $ resesアレイに保存します。
掃除:
curl_multi_remove_handle($ multicurl、$ ch)を使用して、複数のセッションから各Curlハンドルを削除し、 curl_multi_close()を呼び出してCurlセッション全体を閉じます。
出力応答コンテンツ:
最後に、 $ Reses配列を反復し、各リクエストの応答コンテンツを出力します。
非同期処理: curl_multi_*関数の最大の利点の1つは、複数のリクエストを同時に送信できることです。これは、同時リクエストに特に役立ちます。マルチリクエストシナリオでさえ、 curl_multi_getContentは、各リクエストの返品結果を正しく取得できます。
リクエストタイムアウト処理:実際のシナリオでは、サーバーの応答が遅いため他の要求をブロックするリクエストを避けるために、各リクエストのタイムアウトオプションを設定する必要があります。
エラー処理:Curlを使用する場合、リクエストが成功しているかどうかを常に忘れずにCurl_errno($ ch)を使用してエラーコードを取得して、リクエストの問題を特定するのに役立ちます。