ThinkPHP中cookie.php的expire必须填整数秒(如86400),非时间戳;设为0则为会话级Cookie;全局配置仅对未显式传参的Cookie::set()生效,且需清缓存才生效。

cookie.php 里 expire 配置项必须是整数秒,不是时间戳
ThinkPHP 的 cookie.php 配置文件中,expire 字段直接填秒数(如 86400),不是 time() + 86400 这类表达式。框架内部会自动处理为绝对时间,手动加 time() 会导致过期时间远超预期,甚至变成已过期状态。
常见错误现象:设置 'expire' => time() + 86400 后 Cookie 立即失效或根本写不进浏览器。
- 正确写法:
'expire' => 2592000(30 天) - 会话级 Cookie(关浏览器即丢):
'expire' => 0 - 不建议设为负数或字符串,会触发静默降级为会话 Cookie
全局配置 vs 运行时 set(),优先级关系要清楚
cookie.php 中的 expire 是全局默认值,只对未显式传参的 Cookie::set() 调用生效。一旦你在代码里写了 Cookie::set('lang', 'zh-cn', 604800),就完全绕过配置文件里的 expire。
这意味着:
立即学习“PHP免费学习笔记(深入)”;
- 多语言切换这类需明确控制有效期的场景,别依赖配置文件,直接在
set()里传秒数或数组参数 - 如果全站 Cookie 都希望统一 7 天有效期,且不打算动态覆盖,才适合配在
cookie.php里 - 配置文件中的
expire对Cookie::forever()无影响——它内部固定用time() + 31536000(1 年)
path、domain、secure 这些字段不配好,expire 再准也没用
Cookie 是否能被读到,取决于路径、域名、协议三者是否匹配。哪怕 expire 设了 30 天,若 path 是 '/admin',那用户访问首页时就拿不到这个 Cookie,语言切换立刻回退。
生产环境关键配置建议:
-
'path' => '/':确保全站可读,避免子路径隔离 -
'domain' => '.yourdomain.com'(注意开头的点):跨子域共享时必需,否则admin.example.com和www.example.com互不见 -
'secure' => true:HTTPS 站点必须开启,HTTP 下设 true 会导致 Cookie 写入失败 -
'httponly' => true:防 XSS,语言 Cookie 虽不敏感,但统一设更安全
修改 cookie.php 后要清空运行时缓存
ThinkPHP 会缓存配置,改完 config/cookie.php 不重启服务或不清缓存,新配置不会生效。尤其在 CLI 环境或 FPM 模式下,容易误以为配置没起作用。
实操步骤:
- 命令行执行:
php think clear:config - 或者删掉
runtime/config/目录下的缓存文件 - 验证方式:在控制器里打印
config('cookie.expire'),看是否为你设置的数值
真正麻烦的从来不是设多少秒,而是 path 写错、domain 少了个点、secure 在 HTTP 环境下硬开——这些细节一错,expire 再精确也白搭。



















