在PHP开发中,Cookie是一种在客户端存储少量数据的机制,常用于保存用户登录状态、偏好设置等信息,而setcookie函数是PHP中设置Cookie的核心内置函数,掌握它的用法是开发会话相关功能的基础。

setcookie函数基础语法
setcookie函数的基本语法如下,所有参数都是可选除了第一个参数:
<?php /** * setcookie函数参数说明 * @param string $name Cookie的名称,必填 * @param string $value Cookie的值,可选,默认空字符串 * @param int $expires Cookie的过期时间,可选,默认是会话结束失效 * @param string $path Cookie的有效路径,可选,默认是当前脚本所在目录 * @param string $domain Cookie的有效域名,可选,默认是当前域名 * @param bool $secure 是否仅通过HTTPS传输,可选,默认false * @param bool $httponly 是否禁止JavaScript访问,可选,默认false * @return bool 设置成功返回true,失败返回false */ setcookie(string $name, string $value = "", int $expires = 0, string $path = "", string $domain = "", bool $secure = false, bool $httponly = false): bool ?>
基础设置示例
设置一个最简单的Cookie,仅指定名称和值,该Cookie会在浏览器会话结束时自动失效:
<?php
// 设置一个名为user_name,值为zhangsan的Cookie
setcookie("user_name", "zhangsan");
?>
设置带过期时间的Cookie,比如让Cookie7天后失效,需要计算当前时间戳加上7天的秒数:
<?php
// 7天 = 7 * 24 * 60 * 60 秒
$expire_time = time() + 7 * 24 * 60 * 60;
setcookie("user_id", "1001", $expire_time);
?>
常用参数配置说明
路径与域名设置
默认情况下,Cookie仅在设置它的脚本所在目录下有效,如果需要让整个站点都能访问该Cookie,可以将路径设置为根目录:
<?php
// 设置Cookie在整个域名下都有效
setcookie("site_theme", "dark", time() + 3600 * 24 * 30, "/");
?>
如果需要让Cookie在二级域名下共享,可以指定域名参数:
<?php
// 让Cookie在*.ipipp.com下所有二级域名都能访问
setcookie("global_token", "abc123", time() + 3600, "/", ".ipipp.com");
?>
安全属性设置
如果站点启用了HTTPS,建议将secure参数设置为true,避免Cookie在HTTP传输中被窃取:
<?php
// 仅通过HTTPS传输该Cookie
setcookie("auth_token", "xyz789", time() + 3600, "/", "", true);
?>
将httponly参数设置为true,可以禁止JavaScript通过document.cookie访问该Cookie,降低XSS攻击的风险:
<?php
// 禁止JavaScript访问该Cookie
setcookie("session_id", "sess_123", time() + 1800, "/", "", false, true);
?>
Cookie的读取与删除
设置好的Cookie会在后续请求中通过$_COOKIE超全局数组传递给PHP,读取方式如下:
<?php
// 判断Cookie是否存在,再读取避免报错
if (isset($_COOKIE["user_name"])) {
echo "当前用户名称:" . $_COOKIE["user_name"];
} else {
echo "未获取到用户名称Cookie";
}
?>
删除Cookie的方式是将过期时间设置为当前时间之前,同时参数需要和设置时保持一致:
<?php
// 删除之前设置的user_name Cookie,路径需要和设置时一致
setcookie("user_name", "", time() - 3600, "/");
?>
注意事项
- setcookie函数必须在PHP输出任何内容之前调用,否则会因为HTTP响应头已经发送而设置失败,报错提示headers already sent。
- Cookie的值如果是中文或者特殊字符,建议先使用urlencode函数编码,读取时用urldecode解码,避免乱码问题。
- 单个Cookie的大小通常限制在4KB左右,且浏览器对单个域名的Cookie数量也有限制,不适合存储大量数据。
- Cookie是存储在客户端的,用户可以手动修改或删除,因此不要存储敏感信息,或者需要对存储的内容进行加密处理。
注意:如果需要在请求中发送Cookie相关的HTTP头信息,也可以使用header函数手动设置Set-Cookie头,但是setcookie函数的封装更便捷,优先使用setcookie即可。