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

PHP cURL 實現 GET、POST、Cookie 完整提交指南

     編輯:PHP 相關知識

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_POSTFIELDSPOST 數據字符串(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 5.5+)

<?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 類型。

Cookie 持久化會話(模擬登錄流程)

<?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);
?>

常見坑點提醒

  • 傳數組給 POSTFIELDS 強制 multipart:無文件上傳時請用 http_build_query() 轉字符串,避免兼容性問題。
  • HTTPS 證書驗證:生產環境請配置 CURLOPT_CAINFO 指向 CA 證書束,勿長期關閉驗證。
  • 超時設置:必須同時設置 CURLOPT_TIMEOUT(總超時)和 CURLOPT_CONNECTTIMEOUT(連接超時),防止腳本卡死。
  • User-Agent:許多反爬蟲站點拒絕無 UA 或默認 PHP/cURL 的請求,務必模擬真實瀏覽器 UA。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved