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

PHP cURL 儲存與攜帶 Cookie 完整實作:登入模擬與會話保持

     編輯:PHP 相關知識

前言

模擬登入、爬蟲、API 串接常需維持 Cookie 會話。PHP cURL 提供 CURLOPT_COOKIEJAR (儲存) 與 CURLOPT_COOKIEFILE (讀取) 兩大選項,配合檔案即可實現跨請求會話保持。

核心程式碼:登入並儲存 Cookie

<?php
$curl = curl_init();
$url = 'https://example.com/admin/login';
$postData = [
    'username' => 'admin',
    'password' => 'secret123'
];

$cookieFile = sys_get_temp_dir() . '/cookie_' . md5($url) . '.txt';

curl_setopt_array($curl, [
    CURLOPT_URL            => $url,
    CURLOPT_POST           => true,
    CURLOPT_POSTFIELDS     => http_build_query($postData),
    CURLOPT_COOKIEJAR      => $cookieFile,  // 回應的 Set-Cookie 寫入此檔
    CURLOPT_COOKIEFILE     => $cookieFile,  // 後續請求攜帶此檔 Cookie
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_FOLLOWLOCATION => true,
    CURLOPT_SSL_VERIFYPEER => false, // 測試環境略過驗證
]);

$response = curl_exec($curl);
if (curl_errno($curl)) {
    error_log('cURL Error: ' . curl_error($curl));
}
curl_close($curl);

// 後續請求直接重用 $cookieFile 即可攜帶會話
// 例如:curl_setopt($curl, CURLOPT_COOKIEFILE, $cookieFile);

關鍵選項解析

選項用途備註
CURLOPT_COOKIEJAR寫入 Cookie 檔 (回應階段)需可寫入路徑,建議用 sys_get_temp_dir()
CURLOPT_COOKIEFILE讀取 Cookie 檔 (請求階段)同一檔案即可雙向操作
CURLOPT_COOKIE直接設定 Cookie 字串手動構造,不持久化
CURLOPT_COOKIESESSIONtrue = 忽略 session cookie僅發送持久 cookie

進階:多執行緒/並發環境下的 Cookie 隔離

  • 每個 cURL handle 使用獨立 Cookie 檔 (命名含請求 ID)。
  • 或改用記憶體陣列儲存 Cookie:CURLOPT_HEADERFUNCTION 回調解析 Set-Cookie,存入陣列;後續請求用 CURLOPT_COOKIE 發送。
  • Swoole/Workerman 等協程環境下,建議封裝 CookieJar 類管理生命週期。

常見坑點

  1. 路徑權限:Windows 下 C:\Windows\Temp 可能無寫入權限,指定專案 runtime/cookies/ 並授權。
  2. Cookie 過期:檔案長期不清理會導致發送過期 Cookie,定期清理或登入失敗時刪除檔案重試。
  3. HttpOnly/Secure:cURL 會自動處理,無需手動干預。
  4. 重定向丟失 Cookie:確保 CURLOPT_FOLLOWLOCATION 開啟,且同域名下 Cookie 會自動攜帶。

總結

cURL 雙 JAR/FILE 機制極簡單強大:登入請求設定 COOKIEJAR 寫入,後續請求設定 COOKIEFILE 讀取,即可實現完整會話保持。生產環境注意檔案權限、清理策略與並發隔離。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved