cURL 是 PHP 最強大的 HTTP 客戶端庫。本文整理 GET 參數拼接、POST 數據發送(含文件上傳)、Cookie 設置、User-Agent 模擬、重定向跟隨等高頻場景的標準寫法與避坑指南。
<?php
$curl = curl_init();
// 1. 基礎設置
curl_setopt_array($curl, [
CURLOPT_URL => 'https://test.test.com/test.php', // 基礎 URL
CURLOPT_USERAGENT => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36', // 模擬瀏覽器
CURLOPT_HEADER => false, // 不將響應頭混入 body
CURLOPT_RETURNTRANSFER => true, // 返回字符串而非直接輸出
CURLOPT_FOLLOWLOCATION => true, // 自動跟隨 301/302 重定向
CURLOPT_TIMEOUT => 15, // 總超時秒數
CURLOPT_CONNECTTIMEOUT => 5, // 連接超時
CURLOPT_SSL_VERIFYPEER => false, // 測試環境關閉 SSL 驗證
CURLOPT_SSL_VERIFYHOST => false,
]);
// 2. GET 參數(推薦用 http_build_query 拼接到 URL)
$getData = ['get1' => 'val1', 'get2' => 'val2'];
curl_setopt($curl, CURLOPT_URL, 'https://test.test.com/test.php?' . http_build_query($getData));
// 3. POST 數據
$postData = ['p1' => 'test1', 'p2' => 'test2', 'p3' => 'test3'];
// 方案 A:application/x-www-form-urlencoded(最通用,無文件上傳時首選)
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($postData));
// Content-Type 自動為 application/x-www-form-urlencoded
// 方案 B:multipart/form-data(需上傳文件時)
// $postData['file'] = '@/path/to/file.jpg'; // PHP 5.5+ 建議用 CURLFile
// curl_setopt($curl, CURLOPT_POSTFIELDS, $postData); // 不要 http_build_query
// 注意:傳數組會強制 multipart,部分老舊服務端不支持
// 4. Cookie 設置
$cookies = ['c1' => 'v1', 'c2' => 'v2', 'c3' => 'v3'];
$cookieStr = '';
foreach ($cookies as $k => $v) {
$cookieStr .= $k . '=' . $v . '; ';
}
curl_setopt($curl, CURLOPT_COOKIE, $cookieStr); // 發送 Cookie 頭
// 5. 執行並處理結果
$response = curl_exec($curl);
$errno = curl_errno($curl);
$httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
curl_close($curl);
if ($errno) {
echo "cURL Error ($errno): " . curl_error($curl);
} else {
echo "HTTP $httpCode\n$response";
}
?>
| 選項 | 作用 | 典型值 |
|---|---|---|
| CURLOPT_URL | 請求地址 | 字符串 |
| CURLOPT_CUSTOMREQUEST | 指定 HTTP 方法 | 'GET', 'POST', 'PUT', 'DELETE' |
| CURLOPT_POST | 是否 POST 請求 | true/false |
| CURLOPT_POSTFIELDS | POST 數據 | 字符串(urlencoded) 或 數組(multipart) |
| CURLOPT_HTTPHEADER | 自定義請求頭 | ['Authorization: Bearer xxx', 'Content-Type: application/json'] |
| CURLOPT_COOKIE | 發送 Cookie | 'name1=val1; name2=val2' |
| CURLOPT_COOKIEJAR | 保存響應 Cookie 到文件 | '/tmp/cookies.txt' |
| CURLOPT_COOKIEFILE | 從文件讀取 Cookie 發送 | '/tmp/cookies.txt' |
| CURLOPT_FOLLOWLOCATION | 跟隨重定向 | true |
| CURLOPT_MAXREDIRS | 最大重定向次數 | 10 |
| CURLOPT_RETURNTRANSFER | 返回響應體 | true |
| CURLOPT_HEADER | 是否包含響應頭 | false |
<?php
$postData = [
'field1' => 'value1',
'file' => new CURLFile('/path/to/file.jpg', 'image/jpeg', 'filename.jpg'), // 類對象方式
];
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $postData); // 自動 multipart/form-data
?>
舊版 @ 前綴寫法已棄用,請統一用 CURLFile,安全且可控 MIME 類型。
<?php
$cookieFile = sys_get_temp_dir() . '/curl_cookie_' . md5($url) . '.txt';
// 登錄請求
$login = curl_init('https://site.com/login');
curl_setopt_array($login, [
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => http_build_query(['user' => 'a', 'pass' => 'b']),
CURLOPT_COOKIEJAR => $cookieFile, // 保存 Set-Cookie
CURLOPT_RETURNTRANSFER => true,
]);
curl_exec($login);
curl_close($login);
// 後續請求自動攜帶 Cookie
$api = curl_init('https://site.com/api/user');
curl_setopt_array($api, [
CURLOPT_COOKIEFILE => $cookieFile, // 讀取並發送 Cookie
CURLOPT_RETURNTRANSFER => true,
]);
$response = curl_exec($api);
curl_close($api);
?>
http_build_query() 轉字符串,避免兼容性問題。CURLOPT_CAINFO 指向 CA 證書束,勿長期關閉驗證。CURLOPT_TIMEOUT(總超時)和 CURLOPT_CONNECTTIMEOUT(連接超時),防止腳本卡死。PHP/cURL 的請求,務必模擬真實瀏覽器 UA。