cURL 是 PHP 中最強大的 HTTP 客戶端庫,支援 HTTP/HTTPS、FTP、代理、Cookie、認證、斷點續傳等豐富功能。本文從基礎四步驟入手,通過實戰案例講解 POST 請求、模擬登錄保持會話、Cookie 文件存儲陷阱等核心技巧。
$ch = curl_init(); // 1. 初始化
curl_setopt($ch, CURLOPT_URL, $url); // 2. 設置選項(核心)
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // 返回內容而非直接輸出
$data = curl_exec($ch); // 3. 執行請求
curl_close($ch); // 4. 關閉釋放資源
關鍵選項速查:
CURLOPT_POST = 1 → POST 請求CURLOPT_POSTFIELDS → POST 數據(字符串或數組)CURLOPT_COOKIEJAR → 响應 Cookie 保存文件路徑CURLOPT_COOKIEFILE → 請求攜帶 Cookie 文件路徑CURLOPT_FOLLOWLOCATION = true → 自動跟隨 301/302 重定向CURLOPT_SSL_VERIFYPEER = false → 忽略 SSL 證書驗證(開發/測試用)CURLOPT_USERAGENT → 模擬瀏覽器 UACURLOPT_TIMEOUT → 超時秒數$url = 'https://example.com/login.php';
$postData = http_build_query(['username' => 'user', 'password' => 'pass']);
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $postData,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_COOKIEJAR => 'cookie.txt', // 保存登錄後的 Cookie
CURLOPT_FOLLOWLOCATION => true,
]);
$response = curl_exec($ch);
curl_close($ch);
關鍵點: Windows 系統下 Cookie 文件必須存放在 ./temp 目錄,否則讀取失效(親測坑點)。
$loginUrl = 'https://bbs.example.com/login.php';
$indexUrl = 'https://bbs.example.com/';
$cookieFile = tempnam('./temp', 'cookie'); // 生成唯一臨時文件
// 步驟 1:提交登錄表單,保存 Cookie
$postData = http_build_query([
'pwuser' => 'username',
'pwpwd' => 'password',
'forward' => '',
'jumpurl' => $indexUrl,
'step' => 2,
'lgt' => 0,
'question' => 0,
'hideid' => 1,
]);
$ch = curl_init($loginUrl);
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $postData,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_COOKIEJAR => $cookieFile, // 保存 Cookie
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HEADER => 0,
]);
curl_exec($ch);
curl_close($ch);
// 步驟 2:攜帶 Cookie 訪問首頁
$ch = curl_init($indexUrl);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => false, // 直接輸出
CURLOPT_COOKIEFILE => $cookieFile, // 讀取 Cookie
CURLOPT_HEADER => 0,
]);
curl_exec($ch);
curl_close($ch);
$json = json_encode(['key' => 'value']);
curl_setopt($ch, CURLOPT_POSTFIELDS, $json);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: application/json',
'Content-Length: ' . strlen($json)
]);
curl_setopt($ch, CURLOPT_PROXY, '127.0.0.1:8080');
curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_HTTP);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLINFO_HEADER_OUT, true); // 記錄發送的請求頭
$response = curl_exec($ch);
$info = curl_getinfo($ch); // HTTP 碼、耗時、重定向 URL 等
$requestHeader = curl_getinfo($ch, CURLINFO_HEADER_OUT);
| 現象 | 可能原因 | 解決 |
|---|---|---|
| 返回空/false | 網絡不通、域名解析失敗、SSL 驗證失敗 | 檢查 curl_error($ch)、關閉 SSL 驗證、檢查 DNS |
| Cookie 不生效 | 路徑權限、Windows 非 temp 目錄、域名路徑不匹配 | 用 tempnam('./temp','cookie')、確保可寫 |
| 重定向失敗 | 未開啟 FOLLOWLOCATION、安全模式限制 | 開啟選項、或手動解析 Location 頭遞歸請求 |
| 中文亂碼 | 編碼不一致 | 設置 CURLOPT_ENCODING => 'gzip,deflate'、響應手動 mb_convert_encoding |
cURL 是 PHP 爬蟲、API 對接、模擬登錄的利器。掌握 Cookie 機制、請求頭構造、錯誤處理、性能優化(並發可用 curl_multi),即可應對 99% 的 HTTP 交互場景。