在使用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 請求句柄和多句柄資源本身。這就是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()正確釋放資源是處理並發請求後不可忽略的步驟。以下是完整的處理流程總結:
初始化多個cURL 請求句柄;
將句柄加入多句柄資源;
使用curl_multi_exec()處理並發請求;
使用curl_multi_getcontent()獲取結果(可選);
使用curl_close()和curl_multi_close()關閉所有句柄和資源。
通過以上方法,你可以在一個PHP 腳本中高效且優雅地管理多個並發請求,確保系統資源不被浪費。