當前位置: 首頁> 最新文章列表> curl_multi_close 用法示例:如何處理並發HTTP 請求

curl_multi_close 用法示例:如何處理並發HTTP 請求

gitbox 2025-05-12

在現代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()來釋放資源,防止內存洩漏。

基本使用步驟

通常並發請求的完整流程如下:

  1. 初始化multi handle。

  2. 創建多個cURL easy handle,並設置對應的URL 和選項。

  3. 將easy handle 添加到multi handle。

  4. 執行multi handle。

  5. 移除並關閉各個easy handle。

  6. 最後關閉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處理完所有請求後,務必清理所有句柄資源,以保持程序的健壯性和性能。