setcookie() 的 expires 参数必须是整数型时间戳,传字符串会导致 Cookie 变成会话 Cookie;其有效期与 session.cookie_lifetime 无关;HttpOnly 和 Secure 必须显式开启以保障安全。

setcookie() 的 expires 参数必须是时间戳,不是字符串
PHP 设置 Cookie 有效期靠的是 setcookie() 函数的第 3 个参数 $expires,它要求传入一个**整数型时间戳**(秒级,从 Unix 纪元起算),不是 "1 hour" 或 "2025-12-31" 这类字符串。传错类型会导致 Cookie 变成会话 Cookie(浏览器关闭即失效)。
- 正确写法:
setcookie('user_id', '123', time() + 3600)(1 小时后过期) - 错误写法:
setcookie('user_id', '123', '3600')(字符串被转为 0,等效于立即过期) - 错误写法:
setcookie('user_id', '123', strtotime('+1 hour'))(strtotime()返回整数,看似对,但要注意时区——若未设默认时区,可能出错)
session.cookie_lifetime 和 setcookie() 互不影响
初学者常混淆 PHP 的会话机制和手动 Cookie。PHP 的 session_start() 默认创建的 Session Cookie 由配置项 session.cookie_lifetime 控制;而你用 setcookie() 手动写的 Cookie 完全独立,它的有效期只取决于你传给它的 $expires 值。
-
ini_set('session.cookie_lifetime', 86400)只影响$_SESSION关联的 Cookie -
setcookie('theme', 'dark', time() + 600)的 10 分钟有效期不受上述设置干扰 - 两者可共存,但别指望改 session 配置能延长你手写的 Cookie
安全设置:HttpOnly 和 Secure 必须显式开启
Cookie 默认可被 JavaScript 读取(document.cookie),存在 XSS 泄露风险;若网站已启用 HTTPS,不加 Secure 标志会导致浏览器拒绝发送该 Cookie。这些选项不是“可选”,而是上线前必须确认的项。
- 基础安全写法:
setcookie('token', $val, time() + 3600, '/', '', true, true) - 参数顺序:
name, value, expires, path, domain, secure, httponly -
secure = true表示仅通过 HTTPS 传输(HTTP 站点设为 true 后 Cookie 不会被发送) -
httponly = true表示 JS 无法访问(document.cookie里看不到)
setcookie('login_hash', $hash, [
'expires' => time() + 7200,
'path' => '/',
'domain' => '.example.com',
'secure' => true,
'httponly' => true,
'samesite' => 'Strict'
]);
PHP 7.3+ 支持关联数组传参,更清晰;但注意 samesite 值必须是 'Strict'、'Lax' 或 'None'(后者需同时设 secure => true)。漏掉 httponly 或 secure 是生产环境常见低级失误。
立即学习“PHP免费学习笔记(深入)”;











