curl_setopt() 函數簡介
curl_setopt() 是 PHP 中用於為 cURL 會話設定選項的核心函數,自 PHP 4.0.2 起可用。它允許開發者精細控制 HTTP 請求的各種行為,如 URL、請求方法、標頭、超時、代理、SSL 設定等。
函數語法
bool curl_setopt ( resource $ch , int $option , mixed $value )
- $ch:由
curl_init() 返回的 cURL 控制代碼。
- $option:要設定的選項常數(如
CURLOPT_URL)。
- $value:該選項的值,類型取決於選項(整數、字串、資源等)。
常用選項分類詳解
1. 整數型選項(值為長整數)
| 常數 | 說明 |
| CURLOPT_INFILESIZE | 上傳文件時指定文件大小(位元組)。 |
| CURLOPT_VERBOSE | 非零值啟用詳細輸出,方便除錯。 |
| CURLOPT_HEADER | 非零值將回應標頭包含在輸出中。 |
| CURLOPT_NOPROGRESS | 非零值禁用進度條(PHP 預設啟用,僅除錯時修改)。 |
| CURLOPT_NOBODY | 非零值不輸出 Body 部分(適合 HEAD 請求)。 |
| CURLOPT_FAILONERROR | 非零值讓 HTTP 錯誤碼(≥300)導致請求失敗,而非返回頁面內容。 |
| CURLOPT_UPLOAD | 非零值準備上傳。 |
| CURLOPT_POST | 非零值發送標準 application/x-www-form-urlencoded POST 請求。 |
| CURLOPT_FTPLISTONLY | 非零值列出 FTP 目錄名稱。 |
| CURLOPT_FTPAPPEND | 非零值對遠端文件追加而非覆蓋。 |
| CURLOPT_NETRC | 非零值從 ~/.netrc 讀取 FTP 登入資訊。 |
| CURLOPT_FOLLOWLOCATION | 非零值自動跟隨 Location: 重導向(遞歸)。 |
| CURLOPT_PUT | 非零值使用 HTTP PUT 上傳文件,需配合 CURLOPT_INFILE 和 CURLOPT_INFILESIZE。 |
| CURLOPT_MUTE | 非零值讓 cURL 函數完全靜默。 |
| CURLOPT_TIMEOUT | 最大執行秒數。 |
| CURLOPT_LOW_SPEED_LIMIT | 低速限制位元組數。 |
| CURLOPT_LOW_SPEED_TIME | 低速限制持續秒數。 |
| CURLOPT_RESUME_FROM | 斷點續傳的位元組偏移量。 |
| CURLOPT_SSLVERSION | 指定 SSL 版本(預設自動協商)。 |
| CURLOPT_TIMECONDITION | 指定如何處理 CURLOPT_TIMEVALUE(TIMECOND_IFMODSINCE 或 TIMECOND_ISUNMODSINCE),僅限 HTTP。 |
| CURLOPT_TIMEVALUE | 從 1970-01-01 起的秒數,配合上一選項使用。 |
2. 字串型選項
| 常數 | 說明 |
| CURLOPT_URL | 要請求的 URL,也可在 curl_init() 時設定。 |
| CURLOPT_USERPWD | 格式 username:password,用於 HTTP 認證。 |
| CURLOPT_PROXYUSERPWD | 代理認證,格式同 CURLOPT_USERPWD。 |
| CURLOPT_RANGE | 請求範圍,格式 X-Y,支援多區間(逗號分隔)。 |
| CURLOPT_POSTFIELDS | POST 請求的資料字串(或陣列)。 |
| CURLOPT_REFERER | 設定 Referer 標頭。 |
| CURLOPT_USERAGENT | 設定 User-Agent 標頭。 |
| CURLOPT_FTPPORT | FTP PORT 指令使用的 IP/主機名/介面名。 |
| CURLOPT_COOKIE | 直接發送 Cookie 標頭內容。 |
| CURLOPT_SSLCERT | PEM 格式客戶端證書路徑。 |
| CURLOPT_SSLCERTPASSWD | 客戶端證書密碼。 |
| CURLOPT_COOKIEFILE | 讀取 Cookie 的文件路徑(Netscape 或 HTTP 標頭格式)。 |
| CURLOPT_CUSTOMREQUEST | 自定義 HTTP 方法(如 DELETE、PUT),需確認伺服器支援。 |
3. 資源型選項(需 fopen() 返回的文件指標)
| 常數 | 說明 |
| CURLOPT_FILE | 輸出寫入的文件,預設 STDOUT。 |
| CURLOPT_INFILE | 上傳讀取的輸入文件。 |
| CURLOPT_WRITEHEADER | 寫入回應標頭的文件。 |
| CURLOPT_STDERR | 錯誤輸出重導向文件。 |
實戰範例:代理請求並重寫連結
以下範例展示如何使用 cURL 獲取遠端頁面,並利用正則替換實現偽靜態 URL 轉換:
<?php
// 禁用快取標頭
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
header("content-type:text/html; charset=utf-8");
$url = 'https://s.jb51.net';
$querystring = $_SERVER["QUERY_STRING"];
$currentUrl = $_SERVER['SERVER_NAME'];
if ($querystring != '') $querystring .= "&";
$querystring .= "SiteURL=" . $currentUrl;
if ($querystring != '') {
$url .= "?" . $querystring;
}
$ch = curl_init();
$timeout = 60; // 0 表示無超時
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
$handles = curl_exec($ch);
// 連結重寫(配合偽靜態規則)
$handles = preg_replace("/\?page=([0-9]+)&categoryId=([0-9]+)/i", "/fenlei/category-$1-$2.html", $handles);
$handles = preg_replace("/\?categoryId=([0-9]+)/i", "/fenlei/category--$1.html", $handles);
$handles = preg_replace("/\?page=([0-9]+)/i", "/fenlei/category-$1.html", $handles);
$handles = preg_replace("/infodetail\.aspx\?ID=([0-9]+)/i", "/fenlei/$1.html", $handles);
$handles = str_replace("infolist.aspx", "/fenlei/index.html", $handles);
$handles = str_replace("unionlist.aspx", "unionlist.html", $handles);
echo $handles;
?>
重點提示
- 生產環境建議啟用
CURLOPT_SSL_VERIFYPEER 和 CURLOPT_SSL_VERIFYHOST 以驗證 SSL 憑證。
- 使用
CURLOPT_RETURNTRANSFER 將結果作為字串返回,而非直接輸出。
- 超時設定包含連線超時(
CURLOPT_CONNECTTIMEOUT)與總超時(CURLOPT_TIMEOUT)兩者皆需考慮。
- 釋放資源:請求結束後呼叫
curl_close($ch)。