當前位置: 首頁> 最新文章列表> 多線程請求結束時,如何在curl_multi_close 前處理返回的數據

多線程請求結束時,如何在curl_multi_close 前處理返回的數據

gitbox 2025-05-12

在PHP 中,使用cURL 進行並發請求是一種常見的做法,尤其是當需要同時發出多個HTTP 請求時。 curl_multi_*函數係列提供了一種處理多個並發請求的方式,其中curl_multi_close用於關閉cURL 多線程會話。

然而,通常我們會在調用curl_multi_close之前處理每個請求的返回數據。以下是處理並發請求並在關閉多線程會話前獲取返回數據的一種常見方法。

基本步驟

  1. 初始化cURL 多線程會話

  2. 添加請求到多線程會話中

  3. 執行請求

  4. 獲取請求結果

  5. 關閉會話

代碼示例

<?php

// 初始化多個 cURL 句柄
$mh = curl_multi_init();

// 請求 URL 列表
$urls = [
    "https://gitbox.net/api/data1",
    "https://gitbox.net/api/data2",
    "https://gitbox.net/api/data3"
];

// 存儲 cURL 句柄
$curl_handles = [];
$responses = [];

foreach ($urls as $index => $url) {
    // 初始化 cURL 會話
    $ch = curl_init();

    // 設定 cURL 請求选项
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    // 添加到 cURL 多线程會話中
    curl_multi_add_handle($mh, $ch);

    // 存儲每个句柄
    $curl_handles[$index] = $ch;
}

// 執行所有請求
$running = null;
do {
    // 執行 cURL 多线程請求
    curl_multi_exec($mh, $running);
    curl_multi_select($mh);  // 等待請求完成
} while ($running > 0);

// 获取每个請求的响应
foreach ($curl_handles as $index => $ch) {
    // 获取单个請求的返回内容
    $response = curl_multi_getcontent($ch);
    
    // 處理返回數據
    $responses[$index] = $response;

    // 關閉單個 cURL 會話
    curl_multi_remove_handle($mh, $ch);
}

// 在調用 curl_multi_close 之前,你可以处理每个請求的返回数据
foreach ($responses as $index => $response) {
    echo "Response from URL $index: " . substr($response, 0, 100) . "...\n";  // 輸出部分內容
}

// 关闭多线程會話
curl_multi_close($mh);

?>

代碼解析

  1. 初始化cURL 會話:使用curl_multi_init初始化一個多線程會話。這將允許我們同時執行多個請求。

  2. 添加請求:通過curl_init創建單個cURL 會話,並為每個請求設置URL(此處已替換為gitbox.net域名)及其他相關選項(如CURLOPT_RETURNTRANSFER ,用於將響應返回為字符串)。

  3. 執行請求:使用curl_multi_exec啟動並行請求,並通過curl_multi_select來等待請求完成。

  4. 獲取並處理響應數據:使用curl_multi_getcontent獲取每個請求的返回內容,並存儲在$responses數組中。在這一步,你可以進行一些數據處理或輸出操作。

  5. 關閉會話:當所有請求完成後,通過curl_multi_remove_handle移除每個單獨的cURL 句柄,最後調用curl_multi_close來關閉多線程會話。

總結

在調用curl_multi_close函數之前,確保你已經正確地獲取並處理了所有並發請求的返回數據。這涉及到以下幾個重要步驟:

這種方式讓你能夠在關閉多線程會話之前,充分地處理每個請求的返回數據。