cURL 是 PHP 進行 HTTP 請求的核心工具。本文提供一份「複製即用」的初始化模板,覆蓋 URL 設置、返回值控制、Header 處理、Cookie 管理、POST 提交、超時控制、重定向跟隨、Referer、HTTP 版本、連接復用、HTTPS 支持、毫秒級超時等高頻場景,適合作為項目 HTTP 客戶端基礎封裝參考。
<?php
$ch = curl_init();
# 基礎 URL 與返回控制
curl_setopt($ch, CURLOPT_URL, 'https://www.baidu.com/');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // 返回字符串而非直接輸出
curl_setopt($ch, CURLOPT_HEADER, 1); // 包含響應頭
# Cookie 文件持久化(登錄態維持)
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file); // 响應 Cookie 寫入文件
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file); // 請求攜帶文件中 Cookie
# 自定義請求頭
curl_setopt($ch, CURLOPT_HTTPHEADER, array('User-Agent: Mozilla/5.0'));
# POST 請求
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $poststring); // 字符串或數組
# 超時控制
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5); // 連接階段超時 (秒)
curl_setopt($ch, CURLOPT_TIMEOUT, 30); // 整個請求超時 (秒)
# 重定向跟隨
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // 跟隨 301/302
curl_setopt($ch, CURLOPT_MAXREDIRS, 10); // 最大重定向次數
# Referer
curl_setopt($ch, CURLOPT_REFERER, $refer);
# HTTP 版本與連接復用
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
curl_setopt($ch, CURLOPT_FORBID_REUSE, 1); // 禁止連接復用(調試/特殊場景)
# HTTPS 支持(跳過證書驗證,僅測試用)
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
# 毫秒級超時 (cURL 7.15.2+)
curl_setopt($ch, CURLOPT_NOSIGNAL, 1); // 多線程環境避免信號衝突
// curl_setopt($ch, CURLOPT_TIMEOUT_MS, 3000); // 整體毫秒超時
// curl_setopt($ch, CURLOPT_CONNECTTIMEOUT_MS, 500); // 連接毫秒超時
# 執行請求
$response = curl_exec($ch);
# 錯誤處理
if (curl_errno($ch)) {
$error = curl_error($ch);
// 記錄日誌、拋出異常...
curl_close($ch);
return false;
}
# 關閉句柄
curl_close($ch);
# 後續處理 $response...
// 若 CURLOPT_HEADER=1,需分離頭部與體
// list($header, $body) = explode("\r\n\r\n", $response, 2);
| 選項 | 典型值 | 說明 |
|---|---|---|
CURLOPT_URL | 字符串 | 請求目標地址 |
CURLOPT_RETURNTRANSFER | 1/0 | 1=返回字符串,0=直接輸出 |
CURLOPT_POST | 1/0 | 啟用 POST |
CURLOPT_POSTFIELDS | 字符串/數組 | POST 數據,數組自動編碼為 multipart/form-data |
CURLOPT_HTTPHEADER | 數組 | 自定義請求頭,如 array('Content-Type: application/json', 'Authorization: Bearer xxx') |
CURLOPT_COOKIEJAR/FILE | 文件路徑 | Cookie 持久化讀寫 |
CURLOPT_FOLLOWLOCATION | 1/0 | 自動跟隨重定向 |
CURLOPT_SSL_VERIFYPEER | 0/1 | 驗證 SSL 證書(生產必須 1) |
CURLOPT_TIMEOUT | 整數 | 最大執行秒數 |
CURLOPT_CONNECTTIMEOUT | 整數 | 連接等待秒數 |
CURLOPT_PROXY | 字符串 | 代理服務器 ip:port |
CURLOPT_PROXYTYPE | 常量 | CURLPROXY_HTTP、CURLPROXY_SOCKS5 |
HttpClient 類:構造函數初始化公共選項(UA、超時、SSL)、提供 get()/post()/request() 方法、統一異常處理、自動 JSON 編解碼、支持中間件(日誌、重試、熔斷)。guzzlehttp/guzzle、symfony/http-client、php-http/client(PSR-18 標準)。curl_multi_* 系列或 Guzzle\Promise 異步。熟練掌握 cURL 選項組合,是 PHP 後端對接第三方 API、爬蟲、微服務通信的基本功。