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

PHP curl_setopt() 函數完整參數指南與實戰範例

     編輯:PHP 綜合知識

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_POSTFIELDSPOST 請求的資料字串(或陣列)。
CURLOPT_REFERER設定 Referer 標頭。
CURLOPT_USERAGENT設定 User-Agent 標頭。
CURLOPT_FTPPORTFTP PORT 指令使用的 IP/主機名/介面名。
CURLOPT_COOKIE直接發送 Cookie 標頭內容。
CURLOPT_SSLCERTPEM 格式客戶端證書路徑。
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)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved