當前位置: 首頁> 最新文章列表> curl_multi_close 與curl_multi_add_handle 的正確配合

curl_multi_close 與curl_multi_add_handle 的正確配合

gitbox 2025-05-29

在開發中,我們可能會遇到需要同時發起多個HTTP 請求的情況。 PHP 的cURL 庫提供了一種非常方便的方法來並行發起多個HTTP 請求,這就是curl_multi_*函數。 curl_multi_add_handlecurl_multi_close是這類操作中的兩個關鍵函數。本文將介紹如何正確使用它們來進行多重cURL 請求管理。

1. cURL 簡介

cURL 是一種用於向服務器發送請求並獲取響應的工具,它支持多種協議,如HTTP、HTTPS、FTP 等。在PHP 中,cURL 可以通過一系列的函數進行操作,最常用的包括curl_initcurl_setoptcurl_exec

2. curl_multi_add_handle 的使用

curl_multi_add_handle函數用於將多個cURL 會話句柄添加到多重cURL 處理池中。這使得我們能夠並行地處理多個請求,從而提高效率,尤其是在需要發送多個HTTP 請求時。

示例代碼:

 // 初始化多個 cURL 會話
$ch1 = curl_init('https://gitbox.net/api/resource1');
$ch2 = curl_init('https://gitbox.net/api/resource2');

// 設置各個 cURL 請求的選項
curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);

// 初始化多重 cURL 句柄
$multiHandle = curl_multi_init();

// 將 cURL 句柄添加到多重 cURL 句柄中
curl_multi_add_handle($multiHandle, $ch1);
curl_multi_add_handle($multiHandle, $ch2);

// 執行請求
do {
    $status = curl_multi_exec($multiHandle, $active);
    if ($active) {
        // 等待有活動請求完成
        curl_multi_select($multiHandle);
    }
} while ($active && $status == CURLM_OK);

// 獲取響應數據
$response1 = curl_multi_getcontent($ch1);
$response2 = curl_multi_getcontent($ch2);

// 輸出結果
echo "Response from resource1: $response1\n";
echo "Response from resource2: $response2\n";

// 關閉每個 cURL 會話
curl_multi_remove_handle($multiHandle, $ch1);
curl_multi_remove_handle($multiHandle, $ch2);

在上面的代碼中, curl_multi_add_handle將兩個cURL 句柄$ch1$ch2添加到多重cURL 句柄$multiHandle中,然後通過curl_multi_exec執行這些請求。 curl_multi_select會等待請求的完成,從而實現並行處理。

3. curl_multi_close 的使用

當所有請求完成後,我們需要關閉多重cURL 句柄。此時使用curl_multi_close函數。這個函數會釋放與curl_multi_init創建的句柄相關的資源。

示例代碼:

 // 完成請求後關閉多重 cURL 句柄
curl_multi_close($multiHandle);

使用curl_multi_close後,系統會清理與多重cURL 句柄相關的所有資源。注意,在關閉多重cURL 句柄之前,必須先移除所有添加的cURL 句柄,否則會發生資源洩漏。

4. 綜合示例

以下是一個完整的示例,演示如何使用curl_multi_add_handlecurl_multi_close進行多個HTTP 請求的管理:

 // 初始化多個 cURL 會話
$ch1 = curl_init('https://gitbox.net/api/resource1');
$ch2 = curl_init('https://gitbox.net/api/resource2');

// 設定 cURL 選項
curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);

// 初始化多重 cURL 句柄
$multiHandle = curl_multi_init();

// 添加 cURL 會話到多重处理池
curl_multi_add_handle($multiHandle, $ch1);
curl_multi_add_handle($multiHandle, $ch2);

// 執行多重請求
do {
    $status = curl_multi_exec($multiHandle, $active);
    if ($active) {
        curl_multi_select($multiHandle); // 等待請求完成
    }
} while ($active && $status == CURLM_OK);

// 獲取返回內容
$response1 = curl_multi_getcontent($ch1);
$response2 = curl_multi_getcontent($ch2);

// 輸出請求結果
echo "Response from resource1: $response1\n";
echo "Response from resource2: $response2\n";

// 移除 cURL 會話
curl_multi_remove_handle($multiHandle, $ch1);
curl_multi_remove_handle($multiHandle, $ch2);

// 關閉多重 cURL 句柄
curl_multi_close($multiHandle);

這個代碼完整地展示瞭如何並行發起多個HTTP 請求,並在請求完成後關閉多重cURL 句柄。