什么是 Cookie?
Cookie 是一种在客户端(用户浏览器)上存储的小型文本文件,当用户访问一个网站时,服务器可以要求浏览器将一些数据存储在用户的计算机上,之后,当用户再次访问该网站时,浏览器会自动将这些数据发送回服务器。

(图片来源网络,侵删)
主要用途:
- 记住用户登录状态 (Session ID)
- 保存用户偏好设置 (如语言、主题)
- 跟踪用户行为 (用于分析)
- (在小型应用中)
设置 Cookie (保存参数)
在 PHP 中,使用 setcookie() 函数来设置一个 Cookie。
setcookie() 函数语法
setcookie(
string $name,
string $value = "",
int $expires_or_options = 0,
string $path = "",
string $domain = "",
bool $secure = false,
bool $httponly = false
): bool
参数详解
| 参数 | 描述 | 示例 |
|---|---|---|
$name |
Cookie 的名称 (必需),这是一个字符串,用于标识 Cookie。 | "username" |
$value |
Cookie 的值 (可选),存储在 Cookie 中的数据。注意: 值会被自动 URL 编码。 | "john_doe" |
$expires_or_options |
过期时间 (可选),这是一个 Unix 时间戳(自1970年1月1日以来的秒数),表示 Cookie 的有效期,如果设置为 0,或者在 PHP 7.3.0 之前没有提供,Cookie 会在会话结束时(即浏览器关闭时)失效。 | time() + 3600 (表示1小时后过期) |
$path |
服务器路径 (可选),指定 Cookie 在服务器的哪个路径下有效。 表示在整个域名下都有效,"/blog/" 表示只在 /blog/ 目录及其子目录下有效。 |
|
$domain |
域名 (可选),指定 Cookie 对哪个域名有效。".example.com" 会在 www.example.com 和 mail.example.com 下都有效。 |
".yourdomain.com" |
$secure |
仅 HTTPS (可选),设置为 true 时,Cookie 只能通过 HTTPS 连接发送,增加了安全性。强烈推荐在生产环境中使用。 |
true |
$httponly |
仅 HTTP (可选),设置为 true 时,Cookie 将无法通过 JavaScript 的 document.cookie API 访问,这有助于防止跨站脚本攻击窃取 Cookie。强烈推荐设置为 true。 |
true |
设置 Cookie 的示例
示例 1:设置一个会话 Cookie (浏览器关闭后失效)
<?php
// 设置一个名为 "user_language" 的 Cookie,值为 "zh-CN"
// 它将在当前目录及其子目录下有效
setcookie("user_language", "zh-CN");
?>
示例 2:设置一个有有效期的 Cookie (保存7天)

(图片来源网络,侵删)
<?php // 设置一个名为 "username" 的 Cookie,值为 "Alice",有效期7天 // 在整个域名下有效,且仅通过 HTTPS 发送,禁止 JavaScript 访问 $cookie_name = "username"; $cookie_value = "Alice"; $expiry_time = time() + (86400 * 7); // 86400 秒 = 1天 setcookie($cookie_name, $cookie_value, $expiry_time, "/", "", true, true); ?>
重要提示:
setcookie()必须在<html>标签之前 调用,任何在它之前输出的内容(如空格、HTML 标签)都会导致设置失败。- 设置 Cookie 后,它不会在同一脚本中立即可用,它会在下一次页面加载时,通过
$_COOKIE超全局变量可用。
读取 Cookie (获取参数)
当 Cookie 成功设置并被发送到客户端后,在后续的页面请求中,PHP 会自动将这些 Cookie 数据存放在 $_COOKIE 超全局数组中。
从 $_COOKIE 读取数据
<?php
// 检查 Cookie "user_language" 是否存在
if(isset($_COOKIE["user_language"])) {
$language = $_COOKIE["user_language"];
echo "您的语言偏好是: " . htmlspecialchars($language);
} else {
echo "Cookie 'user_language' 未设置。";
}
?>
安全最佳实践:
始终使用 htmlspecialchars() 函数输出从 Cookie 或其他用户输入中获取的数据,以防止跨站脚本攻击。
删除 Cookie
在 PHP 中,没有专门的“删除”Cookie 函数,删除一个 Cookie 的方法是重新设置它,并将其过期时间设置为一个过去的时间。

(图片来源网络,侵删)
删除 Cookie 的示例
<?php // 要删除的 Cookie 名称 $cookie_name = "username"; // 设置过期时间为1小时前 $expiry_time = time() - 3600; // 重新设置 Cookie,使其过期 // 参数需要与创建时保持一致(name, value, expires, path, domain, secure, httponly) setcookie($cookie_name, "", $expiry_time, "/", "", true, true); echo "Cookie '" . $cookie_name . "' 已删除。"; ?>
注意: 删除操作也需要在 <html> 标签之前执行。
完整示例:设置、读取和删除
这是一个简单的、可运行的示例,展示了完整的生命周期。
文件 1: set_cookie.php (设置 Cookie)
<?php
// 设置一个欢迎消息的 Cookie,有效期1小时
$welcome_cookie_name = "welcome_message";
$welcome_cookie_value = "欢迎回来!这是您第 N 次访问。";
$expiry_time = time() + 3600; // 1小时后过期
// 尝试设置 Cookie
if (setcookie($welcome_cookie_name, $welcome_cookie_value, $expiry_time, "/")) {
echo "Cookie '" . $welcome_cookie_name . "' 设置成功!<br>";
} else {
echo "设置 Cookie 失败,请检查是否在 <html> 标签之前调用。";
}
?>
<p>
<a href="read_cookie.php">点击这里去读取 Cookie</a>
</p>
文件 2: read_cookie.php (读取 Cookie)
<?php
// 在页面顶部检查 Cookie
if (isset($_COOKIE["welcome_message"])) {
$message = $_COOKIE["welcome_message"];
echo "从 Cookie 中读取到消息: " . htmlspecialchars($message) . "<br>";
} else {
echo "Cookie 'welcome_message' 不存在或已过期。<br>";
}
?>
<p>
<a href="delete_cookie.php">点击这里删除 Cookie</a>
</p>
文件 3: delete_cookie.php (删除 Cookie)
<?php // 要删除的 Cookie 名称 $cookie_name = "welcome_message"; // 设置过期时间为1小时前 $expiry_time = time() - 3600; // 重新设置 Cookie 以删除它 setcookie($cookie_name, "", $expiry_time, "/"); echo "Cookie '" . $cookie_name . "' 已尝试删除。<br>"; echo "<a href='read_cookie.php'>点击这里验证 Cookie 是否已被删除</a>"; ?>
总结与最佳实践
- 尽早设置:
setcookie()必须在任何 HTML 输出之前调用。 - 安全性:
- 始终为 Cookie 设置
httponly和secure(如果使用 HTTPS) 标志。 - 对从
$_COOKIE读取的任何数据进行转义(如htmlspecialchars())。
- 始终为 Cookie 设置
- 数据量:Cookie 的大小通常限制在 4KB 左右,不要存储大量数据。
- 敏感信息:切勿在 Cookie 中存储密码、信用卡号等敏感信息,对于敏感数据,应使用 Session,并将 Session ID 存储在 Cookie 中。
- 过期时间:为 Cookie 设置合理的过期时间,避免用户离开后数据长期留存。
- 路径和域名:根据需要精确设置
$path和$domain,以增强安全性和避免不必要的 Cookie 发送。
