PHP 设置 Cookie 必须用 setcookie() 且在任何输出前调用,否则报 header 错误;最少需 $name 参数,但实际至少应设 $value、$expires、$path、$domain、$secure、$httponly 六项以确保正常与安全使用。
PHP 设置 Cookie 必须用 setcookie() 函数,且必须在任何输出(包括空格、BOM、echo、HTML)之前调用,否则会报 Warning: Cannot modify header information 错误。
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 风险以下代码适用于 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'
]
);注意: samesi 是 PHP 7.3+ 支持的数组参数写法;低版本需用传统顺序参数(共 7 个),且不支持 
SameSite —— 这会导致现代浏览器(Chrome 80+)默认按 Lax 处理,可能意外丢失 Cookie。
Cookie 不生效?先确认是否触发了输出。哪怕 var_dump($_COOKIE) 放在 setcookie() 前,也会导致失败。
Set-Cookie 字段www.example.com,而 $domain 设为 'example.com'(无点),则 Cookie 不会被发送$expires 可能被浏览器直接忽略localhost 时,$domain 必须为空或不设,填 '.localhost' 会失败(浏览器规范限制)真正麻烦的是 SameSite 行为差异和旧版 PHP 的参数兼容性——很多线上问题不是逻辑错,而是浏览器静默丢弃了 Cookie,连错误提示都没有。
来电咨询