當前位置: 首頁> 最新文章列表> 如何處理curl_multi_close 後仍然獲取返回結果

如何處理curl_multi_close 後仍然獲取返回結果

gitbox 2025-05-29

在PHP 中, curl_multi_*函數被用來同時發起多個cURL 請求,以提高請求的效率。然而,當你調用curl_multi_close結束一個多重cURL 會話時,通常無法再獲取請求的返回結果,因為該函數會關閉所有相關的句柄。要在調用curl_multi_close後仍然獲取每個請求的返回結果,需要採用一些技巧。

在本文中,我們將介紹如何在curl_multi_close後正確地獲取所有請求的返回結果。

使用curl_multi_getcontent來獲取返回結果

在調用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";
}
?>

代碼解析

  1. 初始化多個請求句柄

    • 我們首先定義了一個$urls數組,存儲了所有要請求的URL。在這個例子中,所有的URL 都被替換為gitbox.net域名。

    • 然後,我們為每個URL 創建一個cURL 句柄$ch ,並將其添加到多重cURL 會話中。

  2. 執行請求

  3. 獲取請求結果

    • 在所有請求完成後,我們使用curl_multi_getcontent($ch)獲取每個請求的返回內容,並將其存儲在$responses數組中。

  4. 清理

    • 我們使用curl_multi_remove_handle($multiCurl, $ch)從多重會話中移除每個cURL 句柄,然後調用curl_multi_close()來關閉整個cURL 會話。

  5. 輸出響應內容

    • 最後,遍歷$responses數組,輸出每個請求的響應內容。

注意事項

  • 異步處理curl_multi_*函數的最大優勢之一是可以同時發送多個請求,這對於並發請求特別有用。即使在多請求的場景下, curl_multi_getcontent也能正確地獲取每個請求的返回結果。

  • 請求超時處理:在真實場景中,你可能還需要為每個請求設置超時選項,如CURLOPT_TIMEOUT ,以避免某個請求因服務器響應遲緩而阻塞其他請求。

  • 錯誤處理:在使用cURL 時,始終記得檢查請求是否成功,使用curl_errno($ch)來獲取錯誤碼,幫助你識別請求中的問題。