當前位置: 首頁> 最新文章列表> 在CLI 腳本中使用curl_share_init() 管理多個API 請求

在CLI 腳本中使用curl_share_init() 管理多個API 請求

M66 2025-05-18

在編寫需要進行大量API 請求的PHP CLI 腳本時,合理管理資源和提升性能成為開發者不可忽視的問題。尤其是在需要並發處理多個HTTP 請求的場景中,cURL 提供的一些高級功能,如curl_share_init() ,可以在一定程度上幫助我們復用連接、共享資源,從而提升整體執行效率。本文將深入探討如何在CLI 腳本中使用curl_share_init()管理多個請求。

一、curl_share_init() 是什麼?

curl_share_init()是PHP 提供的一個cURL 函數,用於初始化一個共享句柄。通過該句柄,可以在多個cURL 會話之間共享DNS 緩存、SSL 會話、Cookie 等資源。

支持的共享選項包括:

  • CURLSHOPT_SHARE :

    • CURL_LOCK_DATA_COOKIE :共享cookie 數據。

    • CURL_LOCK_DATA_DNS :共享DNS 緩存。

    • CURL_LOCK_DATA_SSL_SESSION :共享SSL 會話。

這些共享選項在高頻率請求相同主機或域名的接口時尤其有用。

二、使用curl_share_init() 的基本步驟

下面我們來看一個實際的PHP CLI 腳本示例,模擬多個並發請求API,並使用curl_share_init()來提升性能。

 <?php

$urls = [
    "https://m66.net/api/endpoint1",
    "https://m66.net/api/endpoint2",
    "https://m66.net/api/endpoint3",
    "https://m66.net/api/endpoint4"
];

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

// 設置共享類型
curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_COOKIE);
curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_DNS);
curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_SSL_SESSION);

$multiHandle = curl_multi_init();
$curlHandles = [];

foreach ($urls as $url) {
    $ch = curl_init();
    curl_setopt_array($ch, [
        CURLOPT_URL => $url,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_SHARE => $sh,
        CURLOPT_USERAGENT => "PHP-Curl-Client"
    ]);
    curl_multi_add_handle($multiHandle, $ch);
    $curlHandles[] = $ch;
}

// 執行多線程請求
$active = null;
do {
    $mrc = curl_multi_exec($multiHandle, $active);
    curl_multi_select($multiHandle);
} while ($active > 0);

// 處理結果
foreach ($curlHandles as $ch) {
    $response = curl_multi_getcontent($ch);
    $info = curl_getinfo($ch);
    echo "URL: " . $info['url'] . "\n";
    echo "HTTP Code: " . $info['http_code'] . "\n";
    echo "Response: " . substr($response, 0, 100) . "...\n\n";

    curl_multi_remove_handle($multiHandle, $ch);
    curl_close($ch);
}

// 清理資源
curl_share_close($sh);
curl_multi_close($multiHandle);

三、性能對比與資源優化

使用curl_share_init()的好處在以下幾方面體現得尤為明顯:

  1. DNS 緩存復用<br> 避免了每次請求都要重新解析域名,節省DNS 查詢時間

  2. SSL 會話復用<br> 對於HTTPS 請求,復用SSL 會話可以大幅減少握手延遲

  3. Cookie 共享<br> 在多請求間共享登錄態、跟踪信息等,提高請求一致性和有效性

  4. 內存使用優化<br> 多個連接共享部分資源,可以有效減少內存開銷

四、使用場景建議

雖然curl_share_init()功能強大,但並不是所有場景都適合使用它。以下是一些推薦使用的典型場景:

  • 批量請求同一域名下的多個接口;

  • CLI 工具中進行高頻接口同步;

  • 後台服務腳本,如爬蟲、數據採集等。

而在Web 環境中(如FPM 模式下),不建議使用共享句柄,因為並發進程之間無法安全共享資源,可能導致衝突或錯誤。

結語

通過合理使用curl_share_init() ,PHP CLI 腳本能夠更高效地管理多請求任務,不僅提升執行速度,還能節省系統資源。對於需要頻繁與外部API 通信的CLI 工具來說,這是一個極具價值的優化手段。掌握並應用這些高級cURL 技術,將大大提升你在構建高性能PHP 腳本時的競爭力。