首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP cURL 通用封裝:支持 HTTPS、重定向、Header 獲取與偽裝 User-Agent

     編輯:PHP 相關知識

核心代碼

一段生產可用的 cURL 封裝,涵蓋最常見的爬蟲/對接場景:

$header[] = 'Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, text/html, */*';
$header[] = 'Accept-Language: zh-cn';
$header[] = "User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:25.0) Gecko/20100101 Firefox/25.0";

$ch = curl_init();

// 基礎設置
curl_setopt($ch, CURLOPT_URL, $url);                    // 目標 URL
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);            // 返回字符串而非直接輸出
curl_setopt($ch, CURLOPT_HEADER, 1);                    // 包含響應 Header

// HTTPS 支持(跳過證書驗證,生產環境建議配置 CA 憑證)
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);

// 重定向處理
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);            // 自動跟隨 Location
curl_setopt($ch, CURLOPT_MAXREDIRS, 10);                // 最大重定向次數防死循環

// 偽裝瀏覽器
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLOPT_USERAGENT, $header[2]);        // 顯式設置 UA
curl_setopt($ch, CURLOPT_REFERER, $url);                // 可選:設置 Referer

// 執行與清理
$html = curl_exec($ch);
if (curl_errno($ch)) {
    error_log("cURL Error: " . curl_error($ch));
}
curl_close($ch);

// $html 現包含 Header + Body,可用以下方式分離:
// list($responseHeaders, $responseBody) = explode("\r\n\r\n", $html, 2);

關鍵選項解析

選項作用建議值
CURLOPT_RETURNTRANSFER將響應作為字符串返回1 (必須)
CURLOPT_FOLLOWLOCATION自動處理 3xx 重定向1
CURLOPT_MAXREDIRS限制重定向層數10-20
CURLOPT_SSL_VERIFYPEER驗證 SSL 證書生產環境 TRUE + CAINFO
CURLOPT_SSL_VERIFYHOST驗證域名與證書匹配生產環境 2
CURLOPT_TIMEOUT最大執行秒數10-30
CURLOPT_CONNECTTIMEOUT連接等待秒數5-10
CURLOPT_COOKIEJAR/FILECookie 持久化文件路徑
CURLOPT_POSTFIELDSPOST 數據數組或 urlencode 字符串

進階用法片段

發送 POST 請求(JSON)

$data = json_encode(['key' => 'value']);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Content-Type: application/json',
    'Content-Length: ' . strlen($data)
]);

獲取詳細信息

$info = curl_getinfo($ch);
echo "HTTP 狀態碼: " . $info['http_code'] . "\n";
echo "總耗時: " . $info['total_time'] . "s\n";
echo "DNS 解析: " . $info['namelookup_time'] . "s\n";

多請求並發

$mh = curl_multi_init();
// ... 添加多個 handle ...
$active = null;
do {
    $mrc = curl_multi_exec($mh, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);

while ($active && $mrc == CURLM_OK) {
    if (curl_multi_select($mh) != -1) {
        do { $mrc = curl_multi_exec($mh, $active); } while ($mrc == CURLM_CALL_MULTI_PERFORM);
    }
}

最佳實踐提醒

  • 生產環境務必啟用 SSL 驗證,配置 CURLOPT_CAINFO 指向 cacert.pem
  • 設置合理的 CURLOPT_TIMEOUT 防止腳本卡死
  • 使用 curl_error() 和 curl_getinfo() 做完善錯誤處理與監控
  • 高併發場景優先考慮 curl_multi 或 Swoole/Workerman 異步方案
  • Cookie 會話保持需同時設置 COOKIEJAR 和 COOKIEFILE
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved