PHP 设置 Cookie 必须用 setcookie() 且在任何输出前调用,否则报 header 错误;最少需 $name 参数,但实际至少应设 $value、$expires、$path、$domain、$secure、$httponly 六项以确保正常与安全使用。

PHP 设置 Cookie 必须用 setcookie() 函数,且必须在任何输出(包括空格、BOM、echo、HTML)之前调用,否则会报 Warning: Cannot modify header information 错误。
setcookie() 参数含义与必填项
setcookie() 最少需要 1 个参数($name),但只传名字只能创建一个空值、会话级、无路径无域的 Cookie,几乎无法正常使用。实际部署中至少应明确 $value、$expires、$path、$domain、$secure、$httponly 六个关键参数。
-
$name和$value:必需;$value建议用urlencode()编码,避免特殊字符截断 -
$expires:Unix 时间戳;设为0表示浏览器关闭即失效;设为过去时间可删除 Cookie -
$path:默认是当前脚本路径(如/user/),设为'/'才能让整个域名下所有路径读取 -
$domain:跨子域共享需显式写成'.example.com'(注意开头的点);设为''或不填则仅限当前主机名 -
$secure:仅在 HTTPS 连接下发送,生产环境应设为true -
$httponly:设为true可防止 JS 读取,缓解 XSS 风险
设置带有效期和安全限制的 Cookie 示例
以下代码适用于 PHP 7.3+,在 HTTPS 站点上设置一个 7 天有效期、全站可读、禁止 JS 访问的登录态 Cookie:
setcookie(
'auth_token',
urlencode('abc123xyz'),
[
'expires' => time() + 7 * 86400,
'path' => '/',
'domain' => '.example.com',
'secure' => true,
'httponly' => true,
'samesite' => 'Lax'
]
);注意:samesite 是 PHP 7.3+ 支持的数组参数写法;低版本需用传统顺序参数(共 7 个),且不支持 SameSite —— 这会导致现代浏览器(Chrome 80+)默认按 Lax 处理,可能意外丢失 Cookie。
立即学习“PHP免费学习笔记(深入)”;
常见错误与调试技巧
Cookie 不生效?先确认是否触发了输出。哪怕 var_dump($_COOKIE) 放在 setcookie() 前,也会导致失败。
- 检查响应头:用浏览器开发者工具 → Network → Headers → Response Headers,确认是否存在
Set-Cookie字段 - 检查域名匹配:若当前 URL 是
www.example.com,而$domain设为'example.com'(无点),则 Cookie 不会被发送 - 检查时间:服务器时间和客户端时间偏差过大时,
$expires可能被浏览器直接忽略 - 本地测试用
localhost时,$domain必须为空或不设,填'.localhost'会失败(浏览器规范限制)
真正麻烦的是 SameSite 行为差异和旧版 PHP 的参数兼容性——很多线上问题不是逻辑错,而是浏览器静默丢弃了 Cookie,连错误提示都没有。











