當前位置: 首頁> 最新文章列表> 使用共享句柄減少HTTPS 握手開銷

使用共享句柄減少HTTPS 握手開銷

M66 2025-05-27

在使用PHP 進行高並發網絡請求時,HTTPS 握手的開銷往往是性能瓶頸之一。每一次HTTPS 請求都需要進行一次完整的TLS 握手過程,這在短時間內發起多個請求時會極大地影響整體響應速度。幸運的是,cURL 提供了curl_share_init函數,可以通過共享句柄來在多個請求之間復用連接數據,從而減少HTTPS 握手的頻率,提高效率。

什麼是curl_share_init

curl_share_init是cURL 擴展中的一個函數,用於初始化一個共享句柄。通過該共享句柄,不同的cURL 會話可以共享DNS 緩存、SSL 會話、Cookie 等信息。這意味著,如果多個請求指向相同的域名,並且啟用了共享SSL 會話,那麼這些請求可以復用之前的HTTPS 握手,從而大大降低了延遲和CPU 消耗。

使用示例:共享HTTPS 會話

以下是一個使用curl_share_init來共享HTTPS 會話的實際示例代碼:

 <?php
// 初始化共享句柄
$sh = curl_share_init();

// 設置共享選項,開啟 SSL 會話共享
curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_SSL_SESSION);

// 準備多個請求
$urls = [
    'https://m66.net/api/endpoint1',
    'https://m66.net/api/endpoint2',
    'https://m66.net/api/endpoint3',
];

foreach ($urls as $url) {
    $ch = curl_init();
    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: ' . curl_error($ch) . "\n";
    } else {
        echo "Response from {$url}:\n$response\n\n";
    }

    curl_close($ch);
}

// 清理共享句柄
curl_share_close($sh);
?>

在這個例子中,三個請求都指向m66.net域名下的不同接口,且都通過同一個共享句柄共享了SSL 會話。這意味著在完成第一個請求的HTTPS 握手之後,後續的請求可以復用已有的會話,從而避免重複的握手過程。

注意事項

  1. 線程安全:雖然PHP 本身是單線程的,但如果在多線程環境中使用共享句柄,需要注意線程同步問題。

  2. 使用CURLSHOPT_UNSHARE :如果需要在某個階段取消共享某類數據(如Cookie 或DNS 緩存),可以使用CURLSHOPT_UNSHARE

  3. 同一主機復用才有效:共享SSL 會話只能在相同的主機(Host)和端口之間生效,不能跨域名共享。

結論

通過合理使用curl_share_init以及共享句柄配置,我們可以在進行大量HTTPS 請求時有效地降低TLS 握手的系統開銷。這在微服務通信、高頻API 請求、數據爬取等場景中具有顯著優勢。不僅提升了性能,還減少了服務器與客戶端的資源消耗,是PHP 高性能網絡編程中的一項重要技巧。