在現代Web 開發中,性能優化一直是重要的課題。尤其是在需要發起多個HTTP 請求時,如何高效地進行並發管理,直接影響到程序的響應速度和服務器資源的使用效率。 PHP 提供了cURL擴展,其中curl_multi_*系列函數可以幫助開發者同時處理多個請求,大大提升執行效率。
下面我們就來詳細了解一下curl_multi_close的用法,並結合實際示例,講解如何正確地管理並發HTTP 請求。
在PHP 中, curl_multi_close()是用於關閉一個cURL multi handle的函數。當我們使用curl_multi_init()創建了一個multi handle,並通過curl_multi_add_handle()添加了多個單獨的cURL 句柄進行並發處理後,最終需要調用curl_multi_close()來釋放資源,防止內存洩漏。
通常並發請求的完整流程如下:
初始化multi handle。
創建多個cURL easy handle,並設置對應的URL 和選項。
將easy handle 添加到multi handle。
執行multi handle。
移除並關閉各個easy handle。
最後關閉multi handle(使用curl_multi_close() )。
以下是一個完整的示例,演示瞭如何正確使用curl_multi_close()來管理並發的HTTP 請求:
<?php
// 待請求的 URL 列表
$urls = [
'https://gitbox.net/api/data1',
'https://gitbox.net/api/data2',
'https://gitbox.net/api/data3',
];
// 初始化 multi handle
$multiHandle = curl_multi_init();
$curlHandles = [];
// 初始化每個 cURL easy handle,並添加到 multi handle
foreach ($urls as $i => $url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_multi_add_handle($multiHandle, $ch);
$curlHandles[$i] = $ch;
}
// 執行 multi handle
$running = null;
do {
$status = curl_multi_exec($multiHandle, $running);
if ($running) {
// 等待活動連接
curl_multi_select($multiHandle);
}
} while ($running > 0);
// 處理返回結果
foreach ($curlHandles as $ch) {
$content = curl_multi_getcontent($ch);
$info = curl_getinfo($ch);
echo "請求 URL: " . $info['url'] . PHP_EOL;
echo "HTTP 狀態碼: " . $info['http_code'] . PHP_EOL;
echo "返回內容: " . substr($content, 0, 100) . "..." . PHP_EOL;
echo str_repeat("-", 50) . PHP_EOL;
// 移除並關閉 easy handle
curl_multi_remove_handle($multiHandle, $ch);
curl_close($ch);
}
// 關閉 multi handle
curl_multi_close($multiHandle);
?>
一定要在所有easy handle 被移除後,再調用curl_multi_close() 。
如果忘記調用curl_multi_close() ,腳本結束時資源可能會被PHP 自動釋放,但這不是好習慣,尤其在長時間運行或高並發環境下,會造成內存洩露。
curl_multi_close()並不會自動關閉已添加的easy handle,因此在關閉multi handle 前,需手動移除並關閉各個easy handle。
通過合理使用curl_multi_close() ,可以確保並發HTTP 請求管理既高效又安全。記住,在使用curl_multi處理完所有請求後,務必清理所有句柄資源,以保持程序的健壯性和性能。