在開發中,我們可能會遇到需要同時發起多個HTTP 請求的情況。 PHP 的cURL 庫提供了一種非常方便的方法來並行發起多個HTTP 請求,這就是curl_multi_*函數。 curl_multi_add_handle和curl_multi_close是這類操作中的兩個關鍵函數。本文將介紹如何正確使用它們來進行多重cURL 請求管理。
cURL 是一種用於向服務器發送請求並獲取響應的工具,它支持多種協議,如HTTP、HTTPS、FTP 等。在PHP 中,cURL 可以通過一系列的函數進行操作,最常用的包括curl_init 、 curl_setopt和curl_exec 。
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會等待請求的完成,從而實現並行處理。
當所有請求完成後,我們需要關閉多重cURL 句柄。此時使用curl_multi_close函數。這個函數會釋放與curl_multi_init創建的句柄相關的資源。
// 完成請求後關閉多重 cURL 句柄
curl_multi_close($multiHandle);
使用curl_multi_close後,系統會清理與多重cURL 句柄相關的所有資源。注意,在關閉多重cURL 句柄之前,必須先移除所有添加的cURL 句柄,否則會發生資源洩漏。
以下是一個完整的示例,演示如何使用curl_multi_add_handle和curl_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 句柄。