模擬登入、爬蟲、API 串接常需維持 Cookie 會話。PHP cURL 提供 CURLOPT_COOKIEJAR (儲存) 與 CURLOPT_COOKIEFILE (讀取) 兩大選項,配合檔案即可實現跨請求會話保持。
<?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_COOKIESESSION | true = 忽略 session cookie | 僅發送持久 cookie |
CURLOPT_HEADERFUNCTION 回調解析 Set-Cookie,存入陣列;後續請求用 CURLOPT_COOKIE 發送。CookieJar 類管理生命週期。C:\Windows\Temp 可能無寫入權限,指定專案 runtime/cookies/ 並授權。CURLOPT_FOLLOWLOCATION 開啟,且同域名下 Cookie 會自動攜帶。cURL 雙 JAR/FILE 機制極簡單強大:登入請求設定 COOKIEJAR 寫入,後續請求設定 COOKIEFILE 讀取,即可實現完整會話保持。生產環境注意檔案權限、清理策略與並發隔離。