在編寫需要進行大量API 請求的PHP CLI 腳本時,合理管理資源和提升性能成為開發者不可忽視的問題。尤其是在需要並發處理多個HTTP 請求的場景中,cURL 提供的一些高級功能,如curl_share_init() ,可以在一定程度上幫助我們復用連接、共享資源,從而提升整體執行效率。本文將深入探討如何在CLI 腳本中使用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 會話。
這些共享選項在高頻率請求相同主機或域名的接口時尤其有用。
下面我們來看一個實際的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()的好處在以下幾方面體現得尤為明顯:
DNS 緩存復用<br> 避免了每次請求都要重新解析域名,節省DNS 查詢時間
SSL 會話復用<br> 對於HTTPS 請求,復用SSL 會話可以大幅減少握手延遲
Cookie 共享<br> 在多請求間共享登錄態、跟踪信息等,提高請求一致性和有效性
內存使用優化<br> 多個連接共享部分資源,可以有效減少內存開銷
雖然curl_share_init()功能強大,但並不是所有場景都適合使用它。以下是一些推薦使用的典型場景:
批量請求同一域名下的多個接口;
CLI 工具中進行高頻接口同步;
後台服務腳本,如爬蟲、數據採集等。
而在Web 環境中(如FPM 模式下),不建議使用共享句柄,因為並發進程之間無法安全共享資源,可能導致衝突或錯誤。
通過合理使用curl_share_init() ,PHP CLI 腳本能夠更高效地管理多請求任務,不僅提升執行速度,還能節省系統資源。對於需要頻繁與外部API 通信的CLI 工具來說,這是一個極具價值的優化手段。掌握並應用這些高級cURL 技術,將大大提升你在構建高性能PHP 腳本時的競爭力。