CURLOPT_COOKIE适合传少量固定Cookie,需urlencode特殊字符;多Cookie用分号+空格连接;维持会话须配合CURLOPT_COOKIEJAR与CURLOPT_COOKIEFILE;调试异常时手动设置Cookie头更可控。

curl_setopt 里用 CURLOPT_COOKIE 传单个 Cookie 字符串
直接拼接 key=value 形式字符串最简单,适合只传一两个固定 Cookie 的场景。注意不能带空格、分号要转义,否则 curl 会解析失败。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
-
CURLOPT_COOKIE接收的是类似"PHPSESSID=abc123; path=/; domain=.example.com"这样的字符串,但实际只需传"PHPSESSID=abc123",path/domain 等属性 curl 不处理,可省略 - 多个 Cookie 要用分号+空格连接:
"a=1; b=2; c=3",少空格或错用逗号会导致部分 Cookie 被忽略 - 如果值含特殊字符(如空格、等号),需用
urlencode()编码值部分,例如"token=".urlencode("x y=z")
用 CURLOPT_COOKIEFILE 读取本地 Cookie 文件(含会话)
需要维持登录态(比如先 POST 登录再请求个人页),就得保存并复用服务端 Set-Cookie 返回的会话 Cookie。CURLOPT_COOKIEFILE 指定一个文件路径,curl 会自动读取其中内容作为请求 Cookie —— 关键是:该文件必须存在(哪怕为空),且 curl 会按 Netscape Cookie 格式解析。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 先用
CURLOPT_COOKIEJAR把登录响应里的 Cookie 保存下来:curl_setopt($ch, CURLOPT_COOKIEJAR, '/tmp/cookie.txt') - 后续请求设
CURLOPT_COOKIEFILE指向同一文件:curl_setopt($ch, CURLOPT_COOKIEFILE, '/tmp/cookie.txt'),curl 会自动读取并发送 - 文件路径必须可写(写
COOKIEJAR)且可读(读COOKIEFILE),常见坑是权限不足或路径不存在 - 不要手动编辑这个文件来“添加 Cookie”,格式不对(比如少了域名、路径、过期时间字段)会导致整行被跳过
手动构造 Cookie 头(绕过 curl 自动管理)
当目标网站校验 Cookie 请求头格式、或需混用动态生成与服务端下发的 Cookie 时,直接设 Cookie HTTP 头更可控,curl 不会额外干预。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 禁用 curl 的 Cookie 自动管理:
curl_setopt($ch, CURLOPT_COOKIE, '')和curl_setopt($ch, CURLOPT_COOKIEFILE, '')都得显式清空 - 用
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Cookie: a=1; b=2'])手动注入,注意键名大小写不敏感,但值要原样传 - 若需合并服务端给的会话 ID 和自己生成的 token,得先用
preg_match_all从Set-Cookie响应头里提取 PHPSESSID,再拼进手动头里 - 这样做的副作用:丢失了
expires和domain约束,服务端无法做有效期/作用域校验,某些严格站点会拒收
遇到 “Cookie rejected” 或 “Invalid cookie” 错误怎么办
curl 日志里出现这类提示,通常不是代码写错,而是服务端返回的 Set-Cookie 头本身有问题,或者本地 Cookie 文件格式损坏。
排查重点:
- 用
curl_setopt($ch, CURLOPT_HEADER, true)和curl_setopt($ch, CURLOPT_RETURNTRANSFER, true)抓下原始响应头,确认Set-Cookie:行是否含非法字符(比如换行、未闭合引号) - 检查
COOKIEJAR文件内容:每行应为 7 列,用制表符分隔(域名、flag、路径、安全、过期时间、名称、值),少一列或用了空格代替制表符,COOKIEFILE就会静默失效 - PHP 8.1+ 对空
COOKIEFILE路径更敏感,传''可能触发 warning,务必传真实路径或/dev/null - 有些站点用
SameSite=None; Secure,若你没走 HTTPS 却发了 Secure Cookie,浏览器或 curl 会直接丢弃 —— 此时得关掉CURLOPT_SSL_VERIFYPEER并确保请求协议匹配
CURLOPT_COOKIE,模拟登录流程必须用 COOKIEJAR/COOKIEFILE 配对,而调试第三方接口异常时,手动构造头反而最容易定位问题。











