當前位置: 首頁> 最新文章列表> 如何在一個腳本中使用curl_close 結束多個並發請求?

如何在一個腳本中使用curl_close 結束多個並發請求?

gitbox 2025-05-26

在使用PHP 處理並發HTTP 請求時, cURL是一個非常常用且強大的工具。為了提高效率,我們通常使用curl_multi_*系列函數發起多個並發請求。而在完成所有請求後,正確地關閉每一個請求句柄是非常重要的,這正是curl_close()的作用所在。本文將詳細講解如何在一個PHP 腳本中配合curl_multi_exec()使用curl_close()來結束多個並發請求。

基礎準備:發起多個請求

首先,我們需要創建多個cURL 句柄,並通過curl_multi_add_handle()添加到一個多句柄資源中。

 $urls = [
    "https://gitbox.net/api/service1",
    "https://gitbox.net/api/service2",
    "https://gitbox.net/api/service3"
];

$multiHandle = curl_multi_init();
$curlHandles = [];

foreach ($urls as $url) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    
    curl_multi_add_handle($multiHandle, $ch);
    $curlHandles[] = $ch;
}

在這段代碼中,我們將三個URL 添加為三個獨立的cURL 請求句柄,並將它們加入到一個多句柄資源$multiHandle中。

執行並發請求

添加所有句柄後,我們通過curl_multi_exec()curl_multi_select()來處理這些請求的執行:

 $running = null;
do {
    curl_multi_exec($multiHandle, $running);
    curl_multi_select($multiHandle);
} while ($running > 0);

這個循環會持續運行直到所有並發請求完成。 curl_multi_exec()實際發起請求, curl_multi_select()則用於等待活動連接,避免CPU 空轉。

獲取響應內容(可選)

執行完成後,你可能想獲取每一個請求的返回結果:

 $responses = [];
foreach ($curlHandles as $ch) {
    $responses[] = curl_multi_getcontent($ch);
}

關閉句柄:使用curl_close()

請求完成後,我們需要確保所有的資源都被釋放,包括每一個cURL 請求句柄和多句柄資源本身。這就是curl_close()發揮作用的地方:

 foreach ($curlHandles as $ch) {
    curl_multi_remove_handle($multiHandle, $ch);
    curl_close($ch);
}

curl_multi_close($multiHandle);

上述代碼中,我們逐個使用curl_multi_remove_handle()將每個句柄從多句柄資源中移除,然後使用curl_close()關閉它們,最後關閉多句柄資源本身。

小結

使用curl_close()正確釋放資源是處理並發請求後不可忽略的步驟。以下是完整的處理流程總結:

  1. 初始化多個cURL 請求句柄;

  2. 將句柄加入多句柄資源;

  3. 使用curl_multi_exec()處理並發請求;

  4. 使用curl_multi_getcontent()獲取結果(可選);

  5. 使用curl_close()curl_multi_close()關閉所有句柄和資源。

通過以上方法,你可以在一個PHP 腳本中高效且優雅地管理多個並發請求,確保系統資源不被浪費。