PHP设置Cookie
外观
PHP设置Cookie[编辑 | 编辑源代码]
介绍[编辑 | 编辑源代码]
Cookie是存储在用户浏览器中的小型文本数据,用于在多个页面请求间保持状态信息。PHP通过setcookie()
函数实现Cookie的设置与管理,广泛应用于用户登录、个性化设置等场景。
Cookie的主要特性:
- 存储在客户端浏览器
- 可设置过期时间(会话Cookie或持久Cookie)
- 默认大小限制为4KB
- 每次HTTP请求会自动发送到服务器
基本语法[编辑 | 编辑源代码]
PHP设置Cookie的基本语法:
setcookie(
string $name,
string $value = "",
int $expires = 0,
string $path = "",
string $domain = "",
bool $secure = false,
bool $httponly = false
): bool
参数说明:
- $name - Cookie名称(必需)
- $value - Cookie值(默认空字符串)
- $expires - 过期时间戳(0表示会话Cookie)
- $path - 服务器路径(默认当前目录)
- $domain - 有效域名(默认当前域名)
- $secure - 仅HTTPS传输(默认false)
- $httponly - 禁止JavaScript访问(默认false)
基础示例[编辑 | 编辑源代码]
设置简单Cookie[编辑 | 编辑源代码]
<?php
// 设置有效期为1小时的Cookie
setcookie("username", "john_doe", time() + 3600);
// 读取Cookie(下次请求才可用)
echo $_COOKIE['username'] ?? 'Cookie未设置';
?>
输出说明: 首次访问时显示"Cookie未设置",刷新页面后显示"john_doe"
设置带选项的Cookie[编辑 | 编辑源代码]
<?php
setcookie(
"preferences",
"dark_theme",
time() + (30 * 24 * 3600), // 30天有效期
"/", // 全站可用
"example.com", // 主域名及子域名
true, // 仅HTTPS
true // HTTP-only
);
?>
高级用法[编辑 | 编辑源代码]
数组形式Cookie[编辑 | 编辑源代码]
PHP支持通过[]语法设置数组Cookie:
<?php
setcookie("user[username]", "alice");
setcookie("user[preferences][theme]", "dark");
setcookie("user[preferences][font]", "16px");
// 读取时会自动转换为数组
print_r($_COOKIE['user']);
?>
输出结构:
Array ( [username] => alice [preferences] => Array ( [theme] => dark [font] => 16px ) )
Cookie与Header冲突[编辑 | 编辑源代码]
注意:setcookie()
是通过HTTP头实现的,必须在输出任何内容前调用:
<?php
// 正确:在脚本开头设置
setcookie("test", "value");
// 错误:输出后设置会导致警告
echo "Hello";
setcookie("bad_timing", "value"); // 产生警告
?>
实际应用案例[编辑 | 编辑源代码]
用户主题偏好[编辑 | 编辑源代码]
保存用户选择的界面主题:
<?php
if (isset($_POST['theme'])) {
$theme = htmlspecialchars($_POST['theme']);
setcookie("site_theme", $theme, time() + (365 * 24 * 3600), "/");
header("Location: ".$_SERVER['PHP_SELF']); // 重载页面
exit;
}
// 应用主题
$currentTheme = $_COOKIE['site_theme'] ?? 'light';
?>
<html data-theme="<?= $currentTheme ?>">
<!-- 页面内容 -->
</html>
多语言选择[编辑 | 编辑源代码]
存储用户语言偏好:
<?php
$availableLangs = ['en', 'es', 'fr'];
if (isset($_GET['lang']) && in_array($_GET['lang'], $availableLangs)) {
setcookie("user_lang", $_GET['lang'], time() + (30 * 24 * 3600), "/");
}
$userLang = $_COOKIE['user_lang'] ?? 'en';
// 加载对应语言文件
include "lang/$userLang.php";
?>
安全注意事项[编辑 | 编辑源代码]
重要安全实践: 1. 敏感数据不应存Cookie:使用Session存储敏感信息 2. 始终验证Cookie数据:客户端数据不可信 3. 考虑SameSite属性(PHP 7.3+):
setcookie("samesite_test", "1", [
'expires' => time() + 3600,
'samesite' => 'Strict',
'secure' => true,
'httponly' => true
]);
常见问题[编辑 | 编辑源代码]
Cookie未生效的可能原因[编辑 | 编辑源代码]
- 在输出内容后设置Cookie
- 路径/域名限制
- 浏览器禁用Cookie
- 时间设置错误(过去时间会立即过期)
删除Cookie的正确方式[编辑 | 编辑源代码]
设置过期时间为过去:
setcookie("to_delete", "", time() - 3600);
数学计算示例[编辑 | 编辑源代码]
计算Cookie过期时间(30天后过期):
PHP实现:
$expire = time() + 30 * 24 * 60 * 60; // 30天的秒数
总结[编辑 | 编辑源代码]
PHP的Cookie机制为Web开发提供了重要的状态保持能力。正确使用Cookie需要注意:
- 设置时机(在输出前)
- 合理配置参数(路径、域名、安全选项)
- 安全性考虑(HttpOnly、Secure等)
- 数据大小限制
通过合理运用Cookie,可以实现用户偏好保存、简单身份识别等功能,但敏感操作应结合Session等更安全的机制。