原来PHP是这样用Cookie的?
在 Web 开发中,HTTP 是无状态的协议 —— 服务器无法记住 “你是谁”。
而 Cookie 正是解决这个问题的核心手段:记住登录状态、保存用户偏好、跟踪用户行为…… 这些高频需求都离不开 Cookie。
Cookie 基础:什么是 Cookie?
Cookie 是服务器发送给浏览器的一小段文本信息(通常 ≤4KB),浏览器会将其保存在本地。当用户再次访问同一网站时,浏览器会自动把 Cookie 附带在请求中发送给服务器,从而让服务器 “认出” 用户。
简单理解:Cookie 就像服务器给用户发的 “临时身份证”,下次访问时出示即可。
常用方法
设置 Cookie(setcookie())
PHP 中使用 setcookie() 函数设置 Cookie,必须在任何输出(包括 HTML 标签、空格、换行)之前调用,否则会报错。
setcookie(
string $name, // Cookie 名称(必填)
string $value = "", // Cookie 值(可选,空则删除)
int $expires = 0, // 有效期(时间戳,0=关闭浏览器失效)
string $path = "", // 作用路径(空=当前目录)
string $domain = "", // 作用域名(空=当前域名)
bool $secure = false, // 是否仅 HTTPS 传输
bool $httponly = false // 是否仅 HTTP 访问(禁止 JS 读取)
): bool
有效期($expires):
0(默认):会话 Cookie,关闭浏览器后立即失效。time() + 秒数:持久 Cookie,指定时间后失效。
作用路径($path): 控制 Cookie 在哪些目录下可用
""(默认):仅当前目录及其子目录可用。"/":全站可用(最常用)。"/admin":仅/admin目录及其子目录可用。
作用域名($domain): 控制 Cookie 在哪些域名下可用
""(默认):仅当前域名可用(如www.example.com)。".example.com":主域名及所有子域名可用(如www.example.com、admin.example.com)。
安全参数($secure 和 $httponly): 生产环境强烈建议开启
$secure = true:仅在 HTTPS 协议下传输 Cookie,防止明文被窃取。$httponly = true:禁止 JavaScript 读取 Cookie(通过document.cookie),有效防止 XSS 攻击窃取 Cookie。
读取 Cookie:$_COOKIE 超全局变量
Cookie 设置后,下次请求时 PHP 会自动将其解析到 $_COOKIE 数组中,我们可以直接读取。
// 先判断 Cookie 是否存在
if (isset($_COOKIE['username'])) {
$username = $_COOKIE['username'];
echo "欢迎回来," . htmlspecialchars($username) . "!";
}
删除 Cookie
删除 Cookie 的原理是将其有效期设置为过去的时间,让浏览器自动失效。
// 方法 1:将有效期设为过去(推荐,最稳妥)
setcookie("username", "", time() - 3600);
// 方法 2:不设置值,只设过期时间
setcookie("username");
echo "Cookie 已删除";
对 Cookie 内容进行签名 :防止用户篡改 Cookie 值。
用 hash_hmac() 生成签名,验证时比对
// 设置时签名
$value = "user_id_1";
$secret = "your_secret_key"; // 服务器端密钥
$signature = hash_hmac('sha256', $value, $secret);
setcookie("user", $value . "|" . $signature, time() + 3600);
// 读取时验证
if (isset($_COOKIE['user'])) {
list($value, $sig) = explode("|", $_COOKIE['user'], 2);
if (hash_hmac('sha256', $value, $secret) === $sig) {
// 验证通过,Cookie 未被篡改
echo "有效用户:" . $value;
} else {
echo "Cookie 被篡改!";
}
}