當前位置: 首頁> 最新文章列表> 如何通過使用curl_share_init() 函數來避免DNS 重複解析,提高性能?

如何通過使用curl_share_init() 函數來避免DNS 重複解析,提高性能?

M66 2025-06-23

在使用PHP 的cURL 擴展進行大量HTTP 請求時,你可能遇到一個性能瓶頸:DNS 重複解析。每次請求時,cURL 都需要解析一次域名,這會帶來額外的時間開銷,尤其當你對同一個域名進行多次請求時。幸運的是,PHP 提供了一個叫的函數,可以通過共享DNS 緩存來避免這個問題。本文將帶你了解如何使用它。

什麼是curl_share_init()?

curl_share_init()是cURL 擴展提供的一個函數,用於創建一個共享句柄(share handle)。這個共享句柄可以在多個cURL 會話之間共享特定資源,比如DNS 緩存、Cookie、SSL 會話等。
當我們啟用共享DNS 緩存時,多個請求只需要解析一次域名,後續請求可以直接復用結果,大大減少了網絡延遲。

使用步驟

我們用一個簡單的示例代碼來講解如何使用:

 <?php
// 創建 cURL 共享句柄
$sh = curl_share_init();

// 設置共享選項,啟用 DNS 共享
curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_DNS);

$urls = [
    'https://m66.net/api/data1',
    'https://m66.net/api/data2',
    'https://m66.net/api/data3',
];

foreach ($urls as $url) {
    $ch = curl_init();

    // 設定 URL 和其他必要的選項
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    // 綁定共享句柄
    curl_setopt($ch, CURLOPT_SHARE, $sh);

    // 執行請求
    $response = curl_exec($ch);

    if (curl_errno($ch)) {
        echo '錯誤: ' . curl_error($ch) . PHP_EOL;
    } else {
        echo '響應: ' . $response . PHP_EOL;
    }

    // 關閉 cURL 會話
    curl_close($ch);
}

// 關閉共享句柄
curl_share_close($sh);
?>

代碼講解

1??創建共享句柄<br> 我們用curl_share_init()創建一個共享句柄$s h

2??設置共享資源<br> 通過curl_share_setopt( ) ,我們指定共享DNS 數據( CURL_LOCK_DATA_DN S )

3??在每個cURL 會話中綁定共享句柄<br>在curl_setopt()中,使用CURLOPT_SHARE將共享句柄關聯到當前的cURL 句柄$c h

4??關閉句柄<br> 完成所有請求後,記得用curl_share_close()釋放共享句柄

注意事項

  • 共享句柄必須在所有請求都完成後再關閉。

  • 如果程序中同時運行多線程或併發請求,需要小心鎖定資源,防止競爭條件。

  • 共享Cookie、SSL 等數據時也可以用同樣的方式,只需替換CURL_LOCK_DATA_*常量。

性能提升有多大?

對於涉及大量相同域名請求的場景,比如API 聚合、批量抓取、負載測試,避免DNS 重複解析通常能帶來10%~30% 的性能提升,具體取決於DNS 查詢速度和服務器延遲。雖然不是每個場景都能有巨大改進,但這是一個簡單、幾乎無成本的優化手段。