PHP Cookie 创建详解
一、setcookie() 函数完整语法结构
setcookie( string $name, string $value = "", int $expires = 0, string $path = "", string $domain = "", bool $secure = false, bool $httponly = false, array $options = [] ): bool
二、参数详解表
三、完整创建示例与逐行解析
<?php
// 示例1:基础Cookie设置(有效期1小时)
setcookie('visitor_id', 'v20230815', time() + 3600);
// 示例2:带完整参数的安全Cookie
setcookie(
'auth_session', // 名称
'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9', // JWT令牌值
time() + (86400 * 30), // 30天有效期
'/', // 全站有效
'.mydomain.com', // 主域名及子域名
true, // 仅HTTPS
true, // 禁止JS访问
['samesite' => 'Strict'] // 防CSRF攻击
);
// 示例3:数组数据存储(自动编码)
$userPrefs = [
'theme' => 'dark',
'lang' => 'zh-CN',
'font_size' => '16px'
];
setcookie('user_prefs', json_encode($userPrefs), time() + 31536000);
// 示例4:删除Cookie(设置过去时间)
setcookie('old_cookie', '', time() - 3600, '/account');
?>逐行解析:
基础Cookie设置
'visitor_id':Cookie标识名称'v20230815':简单字符串值time() + 3600:当前时间+3600秒(1小时)后过期安全Cookie设置
第1参数:认证会话名称
第2参数:JWT格式的加密令牌
第3参数:
86400*30计算30天的秒数第4参数:
'/'使Cookie在全站有效第5参数:
.mydomain.com允许子域名共享第6/7参数:
true, true启用HTTPS和HttpOnly保护第8参数:
['samesite'=>'Strict']防御CSRF攻击数组数据存储
使用
json_encode()将数组转为JSON字符串存储31536000秒=1年有效期读取时需要用
json_decode()解析删除Cookie
设置空值
''过期时间设为过去
time() - 3600必须匹配原始路径
'/account'
四、参数特性深度说明
1. $expires 参数详解
值为0:会话Cookie,浏览器关闭后失效
未来时间戳:
time()+秒数计算时间单位换算:
3600 // 1小时 86400 // 1天 604800 // 1周 2592000 // 30天 31536000 // 1年
2. $path 路径作用域
3. $domain 域名作用域
4. 安全参数组合
// 高安全配置模板 setcookie($name, $value, [ 'expires' => time() + 86400, 'path' => '/', 'domain' => '.example.com', 'secure' => true, 'httponly' => true, 'samesite' => 'Strict' ]);
五、特殊场景处理
1. 含特殊字符的值
// 需要URL编码
setcookie('search_query', urlencode('price < 100 AND category = "electronics"'), time()+3600);
// 读取时解码
$query = urldecode($_COOKIE['search_query']);2. 批量设置Cookie
$cookies = [
'user_id' => '12345',
'session_token' => bin2hex(random_bytes(16))
];
foreach($cookies as $name => $value) {
setcookie($name, $value, time()+86400, '/', '', true, true);
}3. 检测Cookie是否设置成功
if (isset($_COOKIE['test_cookie'])) {
echo "Cookie设置成功!";
} else {
echo "请检查:1.是否有输出前调用 2.浏览器是否禁用Cookie";
}六、关键注意事项
输出时机
setcookie()必须在任何HTML输出前调用(包括空格和空行)编码规范
名称只能使用字母、数字和下划线
值超过4KB可能被浏览器拒绝
隐私合规
欧盟GDPR要求显示Cookie使用声明
敏感数据应配合Session使用
调试技巧
// 查看所有Cookie print_r($_COOKIE); // 浏览器开发者工具查看 // Application → Cookies
PHP版本差异
7.3+推荐使用数组参数格式
5.6以下需手动设置SameSite属性
通过以上全面讲解,您应该已经掌握了PHP中创建Cookie的所有技术细节。合理使用Cookie可以极大增强Web应用的交互体验,但切记要遵循安全最佳实践。