PHP 8.2 设置 Cookie 必须用 setcookie() 在输出前调用,$expire 参数须为整数型 Unix 时间戳;推荐使用 $options 数组传参,含 expires(int)、path、domain、secure、httponly 等键;设置前需检查 headers_sent(),删除需同 path/domain 并设过期时间。

PHP 8.2 中设置 Cookie,核心是用 setcookie() 函数发送 HTTP 响应头,必须在任何输出(包括空格、HTML、BOM)之前调用,否则会失败。
必须传 Unix 时间戳作为过期时间
PHP 8.2 明确要求 $expire 参数必须是整数型 Unix 时间戳(秒级),不能是字符串日期(如 "Wed, 11 Sep 2026 16:02:00 GMT")、相对描述(如 "+1 hour")或 strtotime() 返回的字符串。否则 cookie 会被当作会话 Cookie(关闭浏览器即失效),甚至静默失败。
- 1 小时后过期:
time() + 3600 - 7 天后过期:
time() + 604800(即7 * 86400) - 30 天后过期:
time() + 2592000 - 永久不过期不推荐;若需长期有效,建议设为 1–2 年后的时间戳
推荐使用 $options 关联数组写法
PHP 7.3+ 起支持数组方式传参,PHP 8.2 完全兼容且语义清晰、不易出错。所有选项都放在一个数组里,"expires" 键值必须是整数时间戳。
-
"expires":必须为int,例如time() + 3600 -
"path":推荐设为"/",确保全站可读 -
"domain":跨子域共享时填".example.com"(注意开头的点) -
"secure":生产环境 HTTPS 站点务必设为true -
"httponly":防止 JS 访问,降低 XSS 风险,建议设为true
示例:
立即学习“PHP免费学习笔记(深入)”;
<?php$options = [
"expires" => time() + 604800,
"path" => "/",
"domain" => "",
"secure" => true,
"httponly" => true,
];
setcookie("theme", "dark", $options);
?>
设置前务必检查输出状态
Cookie 是响应头的一部分,一旦有输出(哪怕是一个空格或 UTF-8 BOM),setcookie() 就会返回 false 且无效。
- 用
headers_sent($file, $line)检查是否还能发头 - 开发时开启
output_buffering可缓冲输出,争取设置时机 - 避免在
<html>标签前、文件开头 BOM、echo/print 之后调用 - 浏览器开发者工具 → Application → Cookies 面板,可直观查看是否写入及过期时间是否正确
读取和删除的基本操作
Cookie 设置成功后,下一次请求即可通过 $_COOKIE['name'] 读取(需先判断是否存在)。
- 读取示例:
if (isset($_COOKIE['theme'])) { $theme = $_COOKIE['theme']; } - 删除本质是覆盖:把
"expires"设为过去时间,且"path"和"domain"必须与设置时完全一致 - 删除示例:
setcookie("theme", "", ["expires" => time() - 3600, "path" => "/"]);



















