PHP Cookie 全面详解
一、Cookie 基本概念
定义:Cookie 是服务器存储在用户浏览器中的小型文本数据(通常小于4KB),用于跟踪和识别用户状态。
工作原理:
服务器通过 HTTP 响应头
Set-Cookie发送 Cookie 到浏览器浏览器保存 Cookie 后,后续请求会自动通过
Cookie请求头发送回服务器主要特性:
存储在客户端(浏览器)
有大小限制(通常4KB)
可以设置过期时间
同源策略限制(域名、路径、协议相同)
二、PHP Cookie 核心语法
1. 设置 Cookie
setcookie( name, // Cookie名称 value, // Cookie值 expire, // 过期时间(Unix时间戳) path, // 服务器上的有效路径 domain, // 有效的域名 secure, // 是否仅通过HTTPS传输 httponly // 是否仅可通过HTTP协议访问(防止JS访问) );
2. 读取 Cookie
$_COOKIE['cookie_name']; // 超全局数组访问
3. 删除 Cookie
setcookie('cookie_name', '', time() - 3600); // 设置过期时间为过去三、完整代码示例与逐行解析
<?php
// 1. 设置一个基础Cookie(有效期1小时)
setcookie('user_token', 'abc123xyz', time() + 3600);
// 2. 设置带更多参数的Cookie
setcookie(
'preferences', // Cookie名称
json_encode(['theme' => 'dark', 'lang' => 'zh']), // 值转为JSON存储
time() + (86400 * 30), // 30天有效期(86400秒=1天)
'/account', // 只在/account路径下有效
'.example.com', // 对子域名有效
true, // 仅HTTPS传输
true // 禁止JavaScript访问
);
// 3. 检查Cookie是否存在
if(isset($_COOKIE['user_token'])) {
// 4. 读取Cookie值
$token = $_COOKIE['user_token'];
echo "用户令牌: " . htmlspecialchars($token);
// 5. 读取复杂Cookie
if(isset($_COOKIE['preferences'])) {
$prefs = json_decode($_COOKIE['preferences'], true);
echo "<br>主题偏好: " . $prefs['theme'];
}
}
// 6. 删除Cookie
setcookie('temp_data', '', time() - 3600, '/');
?>代码逐行解析:
基础Cookie设置
setcookie('user_token', 'abc123xyz', time() + 3600)参数1:Cookie名称为"user_token"
参数2:Cookie值为"abc123xyz"
参数3:当前时间+3600秒(1小时)后过期
高级Cookie设置
使用JSON存储结构化数据
'/account'路径限制:只有访问/account及其子路径时才会发送该Cookie'.example.com'域名:主域名和所有子域名都可访问true, true:安全设置,仅HTTPS传输且禁止JS访问Cookie存在检查
isset($_COOKIE['user_token']):检查指定Cookie是否存在读取简单Cookie
$_COOKIE['user_token']:直接从超全局数组获取值htmlspecialchars():防止XSS攻击,转义HTML特殊字符读取复杂Cookie
json_decode():将JSON字符串解析为PHP数组访问数组元素获取具体偏好设置
删除Cookie
设置过期时间为过去(time() - 3600)
必须指定与设置时相同的路径参数('/')
四、关键注意事项
执行顺序:
setcookie()必须在任何输出之前调用(包括空格和换行)因为它是通过HTTP头实现的
编码处理:
值中如果包含分号、逗号或空格,应该使用
urlencode()编码读取时用
urldecode()解码安全实践:
敏感数据不应存储在Cookie中
总是设置
httponly和secure标志考虑使用
SameSite属性防止CSRF攻击调试技巧:
使用
print_r($_COOKIE)查看所有Cookie浏览器开发者工具的Application面板可查看Cookie详情
五、实际应用场景
1. 用户登录状态保持
// 登录成功后设置
setcookie('auth_token', bin2hex(random_bytes(16)), time() + 86400, '/', '', true, true);
// 检查登录状态
function isLoggedIn() {
return isset($_COOKIE['auth_token']) && validateToken($_COOKIE['auth_token']);
}2. 用户偏好设置
// 保存主题选择
if(isset($_POST['theme'])) {
setcookie('user_theme', $_POST['theme'], time() + 31536000, '/'); // 1年有效期
}
// 应用主题
$theme = $_COOKIE['user_theme'] ?? 'light';3. 购物车功能
// 添加商品到购物车
function addToCart($productId) {
$cart = isset($_COOKIE['cart']) ? json_decode($_COOKIE['cart'], true) : [];
$cart[] = $productId;
setcookie('cart', json_encode($cart), time() + 604800, '/'); // 7天有效期
}六、常见问题解决方案
Cookie未生效:
检查是否在输出内容后调用setcookie()
验证路径和域名设置是否正确
确保浏览器未禁用Cookie
特殊字符问题:
// 正确做法
setcookie('search_term', urlencode('price < 100'), time() + 3600);
$term = urldecode($_COOKIE['search_term']);跨子域名共享:
setcookie('shared_data', 'value', time() + 3600, '/', '.maindomain.com');SameSite属性设置(PHP 7.3+):
setcookie('samesite_test', '1', [
'expires' => time() + 3600,
'path' => '/',
'domain' => 'example.com',
'secure' => true,
'httponly' => true,
'samesite' => 'Strict'
]);通过以上全面讲解,您应该已经掌握了PHP Cookie的核心概念、使用方法和最佳实践。Cookie是Web开发中非常重要的状态管理机制,合理使用可以大大增强用户体验。