Cookie 是存储在客户端计算机上的文本文件,用于跟踪目的。 PHP 透明地支持 HTTP cookie。识别回访用户涉及三个步骤:
- 服务器脚本向浏览器发送一组 cookie。例如姓名、年龄或 ID 等。
- 浏览器将此信息存储在本地计算机上以供将来使用。
- 下次浏览器向 Web 服务器发送任何请求时,它会发送这些 Cookie信息发送到服务器,服务器使用该信息来识别用户。
使用 PHP 创建 Cookie
使用 PHP 创建 Cookie 可以使用 setcookie() 函数。它定义了一个与其余 HTTP 标头一起发送的 cookie。与其他标头一样,cookie 必须在脚本的任何输出之前发送。这需要在任何输出之前调用此函数,包括 <html> 和 <head> 标记以及任何空格。
设置 cookie 后,可以在下一个页面加载时使用 $_COOKIE['xxx'] 访问它们。 Cookie 值也可能存在于 $_REQUEST 数组中。
语法
setcookie(name, value, expires, path,
domain, secure, httponly)
//自 PHP 7.3.0 起可用的替代签名
setcookie(name, value, options)
参数
name | 必填。 指定 cookie 的名称。 |
value | 可选。 指定 cookie 的值。该值存储在客户端计算机上。该值可以通过 $_COOKIE['cookiename'] 检索。 |
expires | 可选。 指定 cookie 过期的时间。这是一个 Unix 时间戳,以纪元以来的秒数表示。例如:time()+60*60*24*30 将设置 cookie 在 30 天后过期。如果设置为 0 或省略,cookie 将在会话结束时(当浏览器关闭时)过期。默认值为 0。 |
path | 可选。 指定cookie的服务器路径。如果设置为"/",则 cookie 将在整个域中可用。如果设置为"/php/",则 cookie 将仅在 /php/ 目录和 php 的所有子目录中可用。默认值是设置 cookie 的当前目录。 |
domain | 可选。 指定 cookie 可用的(子)域名。要使 cookie 在 example.com 的所有子域上可用,请将域设置为"example.com"。将其设置为 www.example.com 将使 cookie 仅在 www 子域中可用 |
secure | 可选。 指定 cookie 是否只能通过安全 HTTPS 连接从客户端传输。当设置为 true 时,仅当存在安全连接时才会设置 cookie。默认值为 false。 |
httponly | 可选。 如果设置为 true,则只能通过 HTTP 协议访问 cookie(无法通过脚本语言(例如 JavaScript)访问 cookie)。此设置有助于减少通过 XSS 攻击进行的身份盗用。默认值为 false。 |
options | 可选。 指定一个关联数组,其中可能包含以下任意键:expires、path、domain、secure 、httponly 和samesite 。如果存在任何其他键,则会生成 E_WARNING 级别的错误。这些值与具有相同名称的参数所描述的含义相同。如果未给出任何允许的选项,则它们的默认值与显式参数的默认值相同。 samesite 元素的值应为None、Lax 或 Strict。如果省略 samesite 元素,则不会设置 SameSite cookie 属性。 |
返回值
如果在调用此函数之前存在输出,setcookie() 将失败并且返回false。如果setcookie()成功运行,它将返回true。这并不表明用户是否接受cookie。
发送Cookie
下面的示例显示如何使用PHP 脚本发送设置cookie 请求。
<!DOCTYPE html>
<?php
//会话结束时过期
setcookie("name", "John Smith");
//1小时后过期
setcookie("age", 27, time()+3600);
//1小时后过期-此cookie将可用
//如果通过安全设置则在整个域内
//来自客户端的HTTPS连接
setcookie("hobbies", "painting", time()+3600, "/", "", 1);
?>
<html>
<head><title>Setting Cookies</title></head>
<body>
<?php echo "Set Cookies"; ?>
</body>
</html>
访问 Cookie
设置 Cookie 后,可以在下一个页面加载时使用 $_COOKIE 数组访问它们。 Cookie 值也可能存在于 $_REQUEST 中。 $_COOKIE['cookiename'] 可用于检索 cookie 值。考虑下面的示例:
<!DOCTYPE html>
<?php
//1小时后过期
setcookie("TestCookie", "CookieValue", time()+3600);
?>
<html>
<head><title>Accessing Cookies</title></head>
<body>
<?php
if(!isset($_COOKIE["TestCookie"])) {
echo "This cookie is not set.";
} else {
echo "Value is: ".$_COOKIE['TestCookie'];
}
?>
</body>
</html>
删除 Cookie
要删除 Cookie,可以使用 setcookie() 函数将过期日期设置为过去。这将触发浏览器中的删除机制。
<!DOCTYPE html>
<?php
//设置过期日期在过去1小时内
//触发浏览器中的删除机制
setcookie("TestCookie", "CookieValue", time()-3600);
?>
<html>
<head><title>Deleting Cookies</title></head>
<body>
<?php echo "Deleting Cookies"; ?>
</body>
</html>
修改 Cookie
要修改 cookie,只需使用 setcookie() 函数再次设置 cookie .
<!DOCTYPE html>
<?php
//这会将过期时间修改为2小时
setcookie("TestCookie", "CookieValue", time()+7200);
?>
<html>
<head><title>Modifying Cookies</title></head>
<body>
<?php echo "Modifying Cookies"; ?>
</body>
</html>
检查Cookies是否启用
下面的例子可以用来检查Cookies是否启用。首先,尝试使用 setcookie() 函数创建一个测试 cookie,然后对 $_COOKIE 数组变量进行计数:
<!DOCTYPE html>
<?php
//这将修改过期时间
//时间为2小时
setcookie("TestCookie", "CookieValue", time()+7200, "/");
?>
<html>
<head><title>Modifying Cookies</title></head>
<body>
<?php
if(count($_COOKIE) > 0) {
echo "Cookies are enabled.";
//代码
} else {
echo "Cookies are disabled.";
//代码
}
?>
</body>
</html>
setcookie() 和数组
可以通过在 cookie 名称中使用数组表示法来设置数组 cookie。考虑下面的示例:
<!DOCTYPE html>
<?php
//设置cookie数组
setcookie("arr[three]", "cookiethree");
setcookie("arr[two]", "cookietwo");
setcookie("arr[one]", "cookieone");
?>
<html>
<head><title>Modifying Cookies</title></head>
<body>
<?php
//页面重新加载后,显示它们
if (isset($_COOKIE['arr'])) {
foreach ($_COOKIE['arr'] as $name => $value) {
$name = htmlspecialchars($name);
$value = htmlspecialchars($value);
echo "$name : $value <br>\n";
}
}
?>
</body>
</html>
上述代码的输出将是:
three : cookiethree
two : cookietwo
one : cookieone
注意:setrawcookie()与setcookie()完全相同,只是cookie值在发送时不会自动进行urlencoded到浏览器。