cURL 是 PHP 最強大的 HTTP 客戶端庫,選項超過 200 個。本文將所有選項按資料類型分為四大類,並標註常用與進階選項。
第一類:布林值選項 (TRUE/FALSE)
| 選項 | 用途 | 備註 |
| CURLOPT_AUTOREFERER | 重定向時自動設定 Referer | 爬蟲必備 |
| CURLOPT_BINARYTRANSFER | 配合 RETURNTRANSFER 回傳原始資料 | 下載檔案用 |
| CURLOPT_COOKIESESSION | 僅傳送 session cookie | 忽略持久 cookie |
| CURLOPT_CRLF | Unix 換行轉 CRLF | Windows 相容 |
| CURLOPT_DNS_USE_GLOBAL_CACHE | 啟用全域 DNS 快取 | 預設開啟、線程安全 |
| CURLOPT_FAILONERROR | HTTP 錯誤碼 ≥ 400 時失敗 | 預設忽略錯誤 |
| CURLOPT_FILETIME | 嘗試取得遠端檔案時間 | 透過 CURLINFO_FILETIME 取得 |
| CURLOPT_FOLLOWLOCATION | 自動追蹤 Location 重定向 | 配合 MAXREDIRS 限制層數 |
| CURLOPT_FORBID_REUSE | 完成後強制斷開連線 | 不重用連線 |
| CURLOPT_FRESH_CONNECT | 強制建立新連線 | 忽略快取連線 |
| CURLOPT_FTP_USE_EPRT | FTP 使用 EPRT/LPRT 指令 | FALSE 則用 PORT |
| CURLOPT_FTP_USE_EPSV | FTP 優先嘗試 EPSV | 被動模式前置 |
| CURLOPT_FTPAPPEND | FTP 附加模式寫入 | 非覆蓋 |
| CURLOPT_FTPASCII | FTP ASCII 模式傳輸 | TRANSFERTEXT 別名 |
| CURLOPT_FTPLISTONLY | 僅列出 FTP 目錄名稱 | 不下載內容 |
| CURLOPT_HEADER | 輸出包含 HTTP 標頭 | 除錯常用 |
| CURLINFO_HEADER_OUT | 追蹤請求字串 | PHP 5.1.3+ |
| CURLOPT_HTTPGET | 強制使用 GET 方法 | 預設即為 GET |
| CURLOPT_HTTPPROXYTUNNEL | 透過 HTTP Proxy 傳輸 | 隧道模式 |
| CURLOPT_MUTE | 重設所有參數為預設值 | 已棄用 |
| CURLOPT_NETRC | 從 ~/.netrc 讀取帳密 | 自動登入 |
| CURLOPT_NOBODY | 不輸出 Body (HEAD 請求) | 檢查資源是否存在 |
| CURLOPT_NOPROGRESS | 關閉進度條 | 預設 TRUE,僅除錯改 FALSE |
| CURLOPT_NOSIGNAL | 忽略信號 (多執行緒必開) | cURL 7.10+ |
| CURLOPT_POST | 發送 POST 請求 | application/x-www-form-urlencoded |
| CURLOPT_PUT | HTTP PUT 上傳檔案 | 需設 INFILE/INFILESIZE |
| CURLOPT_RETURNTRANSFER | 回傳字串而非直接輸出 | 最常用選項 |
| CURLOPT_SSL_VERIFYPEER | 驗證 SSL 憑證 | 生產環境必開,配合 CAINFO |
| CURLOPT_TRANSFERTEXT | FTP/ASCII 模式 | Windows 需設 |
| CURLOPT_UNRESTRICTED_AUTH | 重定向時保持認證資訊 | 跨域也送帳密 |
| CURLOPT_UPLOAD | 啟用檔案上傳 | 配合 INFILE |
| CURLOPT_VERBOSE | 輸出詳細除錯資訊 | 寫入 STDERR 或 CURLOPT_STDERR |
第二類:整數值選項
| 選項 | 用途 | 備註 |
| CURLOPT_BUFFERSIZE | 讀取緩衝區大小 | 不保證填滿,cURL 7.10+ |
| CURLOPT_CLOSEPOLICY | 連線關閉策略 | LEAST_RECENTLY_USED 或 OLDEST |
| CURLOPT_CONNECTTIMEOUT | 連線逾時秒數 | 0 為無限等待 |
| CURLOPT_CONNECTTIMEOUT_MS | 連線逾時毫秒數 | cURL 7.16.2+、PHP 5.2.3+ |
| CURLOPT_DNS_CACHE_TIMEOUT | DNS 快取壽命 (秒) | 預設 120 秒 |
| CURLOPT_FTPSSLAUTH | FTP SSL 認證方式 | SSL/TLS/DEFAULT |
| CURLOPT_HTTP_VERSION | HTTP 版本 | NONE/1.0/1.1 |
| CURLOPT_HTTPAUTH | HTTP 認證方法 | BASIC/DIGEST/GSSNEGOTIATE/NTLM/ANY/ANYSAFE,可用 | 組合 |
| CURLOPT_INFILESIZE | 上傳檔案大小限制 (bytes) | |
| CURLOPT_LOW_SPEED_LIMIT | 低速門檻 (bytes/sec) | 配合 LOW_SPEED_TIME 判斷中斷 |
| CURLOPT_LOW_SPEED_TIME | 低速持續時間 (秒) | 超過此秒數中斷 |
| CURLOPT_MAXCONNECTS | 最大連線數 | 超過依 CLOSEPOLICY 關閉 |
| CURLOPT_MAXREDIRS | 最大重定向次數 | 配合 FOLLOWLOCATION |
| CURLOPT_PORT | 指定連接埠 | 可選 |
| CURLOPT_PROTOCOLS | 允許的協定位元遮罩 | HTTP/HTTPS/FTP/FTPS/SCP/SFTP/TELNET/LDAP/DICT/FILE/TFTP/ALL,cURL 7.19.4+ |
| CURLOPT_PROXYAUTH | Proxy 認證方式 | 僅 BASIC/NTLM,cURL 7.10.7+ |
| CURLOPT_PROXYPORT | Proxy 連接埠 | 也可在 PROXY 中指定 |
| CURLOPT_PROXYTYPE | Proxy 類型 | HTTP (預設) / SOCKS5,cURL 7.10+ |
| CURLOPT_REDIR_PROTOCOLS | 重定向允許的協定 | 預設除 FILE/SCP 外全開,cURL 7.19.4+ |
| CURLOPT_RESUME_FROM | 續傳位元組偏移量 | 斷點續傳用 |
| CURLOPT_SSL_VERIFYHOST | 驗證 SSL Common Name | 1=檢查存在、2=檢查匹配主機名 |
| CURLOPT_SSLVERSION | SSL 版本 | 2/3,通常自動偵測 |
| CURLOPT_TIMECONDITION | 時間條件模式 | IFMODSINCE/IFUNMODSINCE |
| CURLOPT_TIMEOUT | 總執行逾時秒數 | 整個請求上限 |
| CURLOPT_TIMEOUT_MS | 總執行逾時毫秒數 | cURL 7.16.2+、PHP 5.2.3+ |
| CURLOPT_TIMEVALUE | 時間條件的時間戳 | 配合 TIMECONDITION |
第三類:字串值選項
| 選項 | 用途 | 備註 |
| CURLOPT_CAINFO | CA 憑證檔案路徑 | 配合 SSL_VERIFYPEER |
| CURLOPT_CAPATH | CA 憑證目錄 | 配合 SSL_VERIFYPEER |
| CURLOPT_COOKIE | 手動設定 Cookie 標頭 | 格式:name=value; name2=value2 |
| CURLOPT_COOKIEFILE | 讀取 Cookie 的檔案 | Netscape 格式或 HTTP 標頭 |
| CURLOPT_COOKIEJAR | 儲存 Cookie 的檔案 | 連線結束後寫入 |
| CURLOPT_CUSTOMREQUEST | 自訂 HTTP 方法 | GET/POST/PUT/DELETE/CONNECT 等,勿輸入完整請求行 |
| CURLOPT_EGDSOCKET | EGD Socket 路徑 | 類似 RANDOM_FILE |
| CURLOPT_ENCODING | Accept-Encoding 標頭 | identity/deflate/gzip,空字串=全支援 |
| CURLOPT_FTPPORT | FTP PORT 指令 IP | IP/主機名/介面名/- (預設) |
| CURLOPT_INTERFACE | 外送網路介面 | 介面名/IP/主機名 |
| CURLOPT_KRB4LEVEL | Kerberos 4 安全等級 | clear/safe/confidential/private |
| CURLOPT_POSTFIELDS | POST 資料內容 | 字串或陣列,陣列自動變 multipart/form-data,檔案加 @ 前綴 |
| CURLOPT_PROXY | HTTP Proxy 位址 | host:port |
| CURLOPT_PROXYUSERPWD | Proxy 帳密 | username:password |
| CURLOPT_RANDOM_FILE | SSL 隨機種子檔案 | |
| CURLOPT_RANGE | 範圍請求 | X-Y 格式,支援多段 X-Y,N-M |
| CURLOPT_REFERER | Referer 標頭 | |
| CURLOPT_SSL_CIPHER_LIST | SSL 加密套件清單 | 如 RC4-SHA、TLSv1 |
| CURLOPT_SSLCERT | PEM 格式客戶端憑證 | |
| CURLOPT_SSLCERTPASSWD | 客戶端憑證密碼 | |
| CURLOPT_SSLCERTTYPE | 憑證類型 | PEM (預設)/DER/ENG,cURL 7.9.3+ |
| CURLOPT_SSLENGINE | SSL 私鑰加密引擎 | |
| CURLOPT_SSLENGINE_DEFAULT | 非對稱加密引擎 | |
| CURLOPT_SSLKEY | SSL 私鑰檔案 | |
| CURLOPT_SSLKEYPASSWD | 私鑰密碼 | 敏感資訊,注意腳本安全 |
| CURLOPT_SSLKEYTYPE | 私鑰類型 | PEM/DER/ENG |
| CURLOPT_URL | 請求目標 URL | 也可在 curl_init() 指定 |
| CURLOPT_USERAGENT | User-Agent 標頭 | |
| CURLOPT_USERPWD | HTTP 認證帳密 | username:password |
第四類:陣列值選項
| 選項 | 用途 | 格式範例 |
| CURLOPT_HTTP200ALIASES | 視為成功的 HTTP 200 代碼陣列 | array(200, 201, 204) |
| CURLOPT_HTTPHEADER | 自訂 HTTP 標頭陣列 | array('Content-type: text/plain', 'Content-length: 100') |
| CURLOPT_POSTQUOTE | FTP 執行後的指令陣列 | array('DELE file.txt') |
| CURLOPT_QUOTE | FTP 執行前的指令陣列 | array('TYPE I') |
資源型別選項 (Stream Resource)
| 選項 | 用途 |
| CURLOPT_FILE | 輸出寫入檔案 (預設 STDOUT) |
| CURLOPT_INFILE | 上傳讀取檔案 |
| CURLOPT_STDERR | 錯誤輸出位置 (預設 STDERR) |
| CURLOPT_WRITEHEADER | 標頭寫入檔案 |
回呼函式選項
| 選項 | 回呼簽名 | 用途 |
| CURLOPT_HEADERFUNCTION | fn($ch, $header) : int | 處理回應標頭,回傳已寫入位元組數 |
| CURLOPT_PASSWDFUNCTION | fn($ch, $prompt, $maxlen) : string | 提供密碼 |
| CURLOPT_PROGRESSFUNCTION | fn($ch, $dltotal, $dlnow, $ultotal, $ulnow) : int | 進度回呼,回傳非 0 中斷 |
| CURLOPT_READFUNCTION | fn($ch, $fd, $length) : string | 讀取上傳資料,回傳資料,空字串=EOF |
| CURLOPT_WRITEFUNCTION | fn($ch, $data) : int | 處理回應資料,回傳已寫入位元組數 |
常用組合範例
// 標準 GET 請求
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => 'https://api.example.com/data',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 10,
CURLOPT_CONNECTTIMEOUT => 5,
CURLOPT_SSL_VERIFYPEER => true,
CURLOPT_SSL_VERIFYHOST => 2,
CURLOPT_USERAGENT => 'MyApp/1.0',
]);
$response = curl_exec($ch);
curl_close($ch);
// POST JSON 資料
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => 'https://api.example.com/submit',
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode($data),
CURLOPT_HTTPHEADER => [
'Content-Type: application/json',
'Authorization: Bearer ' . $token,
],
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
]);
$response = curl_exec($ch);
curl_close($ch);
// 檔案上傳 (PHP 5.5+ 建議使用 CURLFile)
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => 'https://api.example.com/upload',
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => [
'file' => new CURLFile('/path/to/file.jpg', 'image/jpeg', 'filename.jpg'),
'field2' => 'value',
],
CURLOPT_RETURNTRANSFER => true,
]);
$response = curl_exec($ch);
curl_close($ch);
錯誤處理最佳實踐
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FAILONERROR, true); // 4xx/5xx 觸發錯誤
$response = curl_exec($ch);
$errno = curl_errno($ch);
$error = curl_error($ch);
$info = curl_getinfo($ch);
curl_close($ch);
if ($errno) {
// 網路層錯誤:連線失敗、逾時、DNS 解析失敗等
throw new Exception("cURL Error [$errno]: $error");
}
$httpCode = $info['http_code'];
if ($httpCode >= 400) {
// 應用層錯誤
throw new Exception("HTTP Error $httpCode: $response");
}