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

PHP cURL 核心選項 curl_setopt 深度解析:分類速查、常見誤區與最佳實踐

     編輯:PHP 相關知識

curl_setopt 參數分類總覽

curl_setopt(CurlHandle $ch, int $option, mixed $value): bool 選項按值類型分為長整數、字符串、流資源、陣列/對象(部分)。以下為高頻選項分類速查表(PHP 8.2 / libcurl 7.88+)。

1. 行為控制 (長整數)

常量說明典型值/備註
CURLOPT_RETURNTRANSFER返回字符串而非直接輸出必開 true,否則直接 echo
CURLOPT_HEADER包含響應頭在輸出中true 便於調試/解析 Set-Cookie
CURLOPT_FOLLOWLOCATION自動跟隨 3xx 重定向true,配合 CURLOPT_MAXREDIRS (默認 20)
CURLOPT_FAILONERRORHTTP ≥ 400 視為失敗true 觸發 CURLE_HTTP_RETURNED_ERROR
CURLOPT_SSL_VERIFYPEER驗證服務器 SSL 證書生產必開 true,測試可 false
CURLOPT_SSL_VERIFYHOST驗證證書 CN/SAN 匹配主機名2 (默認嚴格),0 不驗證,1 已棄用
CURLOPT_TIMEOUT最大執行秒數整數秒,含連接+傳輸
CURLOPT_CONNECTTIMEOUT連接階段超時秒數建議 5-10s,防止掛起
CURLOPT_LOW_SPEED_LIMIT/CURLOPT_LOW_SPEED_TIME低速限制觸發中斷如 1024, 30 表示 30s 內平均 <1KB/s 則斷開
CURLOPT_BUFFERSIZE讀寫緩衝區大小默認 16KB,大文件可調大
CURLOPT_HTTP_VERSION指定 HTTP 版本CURL_HTTP_VERSION_2_0、CURL_HTTP_VERSION_1_1
CURLOPT_PIPEWAIT等待管道/多路複用HTTP/2 多路複用優化

2. 請求構造 (字符串/陣列)

常量說明典型用法
CURLOPT_URL請求地址必填,含 query string
CURLOPT_CUSTOMREQUEST自定義 HTTP 方法'GET'/'POST'/'PUT'/'DELETE'/'PATCH'
CURLOPT_POST發送 POST 請求true 隱含 CURLOPT_POSTFIELDS
CURLOPT_POSTFIELDSPOST 數據陣列 => multipart/form-data;字符串 => application/x-www-form-urlencoded
CURLOPT_HTTPHEADER自定義請求頭['Content-Type: application/json', 'Authorization: Bearer ...']
CURLOPT_USERAGENTUser-Agent模擬瀏覽器或標識服務名
CURLOPT_REFERERReferer 頭防盜鏈、統計追蹤
CURLOPT_COOKIE直接發送 Cookie 字符串'name=value; name2=value2'
CURLOPT_COOKIEFILE/CURLOPT_COOKIEJARCookie 文件讀/寫同一文件實現會話保持
CURLOPT_USERNAME/CURLOPT_PASSWORDHTTP Basic Auth替代 URL 中嵌入憑證
CURLOPT_PROXY/CURLOPT_PROXYPORT代理服務器'https://proxy:3128'、CURLOPT_PROXYTYPE
CURLOPT_PROXYUSERPWD代理認證'user:pass'

3. 流與回調 (資源/可調用)

常量說明回調簽名
CURLOPT_FILE (CURLOPT_INFILE)響應體寫入文件句柄fopen('out.bin','wb'),大文件直寫磁盤
CURLOPT_WRITEFUNCTION響應體寫入回調function($ch, $data): int { return strlen($data); } 返回寫入字節數
CURLOPT_READFUNCTION請求體讀取回調 (上傳)function($ch, $fd, $max): string
CURLOPT_HEADERFUNCTION響應頭解析回調function($ch, $header): int
CURLOPT_PROGRESSFUNCTION進度回調需 CURLOPT_NOPROGRESS=false,function($ch, $dlTotal, $dlNow, $ulTotal, $ulNow): int
CURLOPT_DEBUG_FUNCTION調試信息回調function($ch, $type, $data): int,需 CURLOPT_VERBOSE=true

4. 高級/特殊

  • CURLOPT_SSLCERT/CURLOPT_SSLKEY/CURLOPT_SSLCERTPASSWD:客戶端證書雙向 TLS。
  • CURLOPT_CAINFO/CURLOPT_CAPATH:自定義 CA 憑證包路徑。
  • CURLOPT_ENCODING:'' 啟用所有內建解碼 (gzip, deflate, br, zstd)。
  • CURLOPT_RESOLVE:['example.com:443:1.2.3.4'] 手動解析,繞過 DNS/測試新 IP。
  • CURLOPT_UNIX_SOCKET_PATH:走 Unix Domain Socket 訪問本地服務。
  • CURLOPT_HAPROXYPROTOCOL:發送 HAProxy PROXY protocol v1 頭。

高頻誤區與最佳實踐

  1. CURLOPT_POSTFIELDS 陣列 vs 字符串:傳陣列強制 multipart/form-data (含文件上傳需 CURLFile);傳 JSON 字符串需手動 json_encode + 設置 Content-Type: application/json。
  2. 重用 Handle 時未重置選項:curl_setopt_array($ch, [...]) 或逐個 curl_setopt 覆蓋,避免上次請求的 Header/Cookie 殘留。
  3. 忽略 CURLOPT_SSL_VERIFYPEER:生產環境 絕不可設為 false,若憑證信任鏈不全,請補全 CA 或使用 CURLOPT_CAINFO 指定合法 CA 文件。
  4. 超時設置不全:必須同時設置 CURLOPT_CONNECTTIMEOUT 和 CURLOPT_TIMEOUT,否則可能無限阻塞。
  5. 未檢查 curl_errno():HTTP 200 但 cURL 錯誤碼非 0 表示傳輸層失敗(如 TLS 握手失敗、連接重置)。
  6. 大文件下載未用流式寫入:CURLOPT_RETURNTRANSFER 會將整個響應體載入內存,GB 級文件直接 OOM。必須用 CURLOPT_WRITEFUNCTION + 文件句柄。
  7. 並發場景未使用 curl_multi 或 Swoole 協程:串行請求無法滿足高吞吐需求。

調試三件套

$ch = curl_init($url);
curl_setopt($ch, CURLOPT_VERBOSE, true);
curl_setopt($ch, CURLOPT_STDERR, $fp = fopen('php://temp', 'rw'));
curl_exec($ch);
rewind($fp);
echo stream_get_contents($fp); // 輸出完整 TLS 握手、請求/響應頭、數據流向
fclose($fp);

或使用 curl_getinfo($ch, CURLINFO_*) 獲取精確耗時:CURLINFO_TOTAL_TIME, CURLINFO_NAMELOOKUP_TIME, CURLINFO_CONNECT_TIME, CURLINFO_PRETRANSFER_TIME, CURLINFO_STARTTRANSFER_TIME, CURLINFO_REDIRECT_TIME。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved