在PHP 中, curl_multi_*函數被用來同時發起多個cURL 請求,以提高請求的效率。然而,當你調用curl_multi_close結束一個多重cURL 會話時,通常無法再獲取請求的返回結果,因為該函數會關閉所有相關的句柄。要在調用curl_multi_close後仍然獲取每個請求的返回結果,需要採用一些技巧。
在本文中,我們將介紹如何在curl_multi_close後正確地獲取所有請求的返回結果。
在調用curl_multi_close後,可以通過curl_multi_getcontent獲取每個cURL 請求的響應內容。為了能正確地獲取所有的返回結果,必須確保在關閉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";
}
?>
初始化多個請求句柄:
我們首先定義了一個$urls數組,存儲了所有要請求的URL。在這個例子中,所有的URL 都被替換為gitbox.net域名。
然後,我們為每個URL 創建一個cURL 句柄$ch ,並將其添加到多重cURL 會話中。
執行請求:
使用curl_multi_exec()來執行所有添加到會話中的請求。我們通過curl_multi_select()確保我們不會空轉,直到請求完成。
獲取請求結果:
在所有請求完成後,我們使用curl_multi_getcontent($ch)獲取每個請求的返回內容,並將其存儲在$responses數組中。
清理:
我們使用curl_multi_remove_handle($multiCurl, $ch)從多重會話中移除每個cURL 句柄,然後調用curl_multi_close()來關閉整個cURL 會話。
輸出響應內容:
最後,遍歷$responses數組,輸出每個請求的響應內容。
異步處理: curl_multi_*函數的最大優勢之一是可以同時發送多個請求,這對於並發請求特別有用。即使在多請求的場景下, curl_multi_getcontent也能正確地獲取每個請求的返回結果。
請求超時處理:在真實場景中,你可能還需要為每個請求設置超時選項,如CURLOPT_TIMEOUT ,以避免某個請求因服務器響應遲緩而阻塞其他請求。
錯誤處理:在使用cURL 時,始終記得檢查請求是否成功,使用curl_errno($ch)來獲取錯誤碼,幫助你識別請求中的問題。