Php 简明教程
PHP - Cookies
万维网由 HTTP 协议驱动,该协议是一种无状态协议。Cookie 机制帮助服务器维护以前请求的信息。PHP 透明支持 HTTP cookie。
-
当客户端首次发送其请求时,服务器随其响应一起包含一个小数据段,作为 cookie。PHP 提供了 setcookie() 方法,用于在响应中注入 cookie。
-
此 cookie 数据以文本文件形式存储在客户端计算机中。在同一客户端的后续访问中,这些 cookie 将作为 request 标头的组成部分包含在内。
-
服务器使用客户端请求中存在的所有 cookie 来填充 PHP 超级全局变量 “$_COOKIE”。
本章将教您如何设置 cookie、如何访问 cookie 以及如何删除 cookie。
The Anatomy of a Cookie
Cookie 通常设置在 HTTP 头中(尽管 JavaScript 也可以直接在浏览器上设置 cookie)。设置 cookie 的 PHP 脚本可能会发送类似以下内容的头:
HTTP/1.1 200 OK
Date: Fri, 04 Feb 2000 21:03:38 GMT
Server: Apache/1.3.9 (UNIX) PHP/4.0b3
Set-Cookie: name=xyz; expires=Friday, 04-Feb-07 22:03:38 GMT;
path=/; domain=tutorialspoint.com
Connection: close
Content-Type: text/html
如您所见,Set-Cookie 标头包含一个名称值对、一个 GMT 日期、一个路径和一个域名。名称和值将经过 URL 编码。expires 字段是指示浏览器在给定时间和日期后“忘记”Cookie 的指令。
如果浏览器配置为存储 cookie,它会将此信息保留至到期日期。如果用户将浏览器指向与 cookie 路径和域名匹配的任何页面,它将重新发送 cookie 至服务器浏览器头可能类似以下内容:
GET / HTTP/1.0
Connection: Keep-Alive
User-Agent: Mozilla/4.6 (X11; I; Linux 2.2.6-15apmac ppc)
Host: zink.demon.co.uk:1126
Accept: image/gif, */*
Accept-Encoding: gzip
Accept-Language: en
Accept-Charset: iso-8859-1,*,utf-8
Cookie: name=xyz
随后,PHP 脚本可以访问环境变量 $_COOKIE 或 $HTTP_COOKIE_VARS[]中的 cookie,其中包含所有 cookie 名称和值。可以使用 $HTTP_COOKIE_VARS["name"] 访问上述 cookie。
How to Set a Cookie in PHP?
PHP 包含 setcookie 函数,用于创建要随 HTTP 响应一起发送给客户端的 cookie 对象。
setcookie(name, value, expire, path, domain, security);
Parameters
以下是所有参数的详细信息-
-
Name -这将设置 cookie 的名称,并存储在名为 HTTP_COOKIE_VARS 的环境变量中。在访问 cookie 时使用此变量。
-
Value -这将设置命名变量的值,并且是您实际上要存储的内容。
-
Expiry − 此处指定了自 1970 年 1 月 1 日格林威治时间 00:00:00 起的秒数中的未来时间。在此时间之后,Cookie 将变得不可访问。如果未设置此参数,则会在关闭 Web 浏览器时自动使 Cookie 过期。
-
Path − 此处指定了 Cookie 生效的目录。单个正斜杠字符允许 Cookie 对所有目录生效。
-
Domain − 在非常大的域中,此可用于指定域名,并且必须包含至少两个句点才有效。所有 Cookie 仅对创建它们的 host 和域有效。
-
Security − 此处可将其设置为 1,以指定只应通过使用 HTTPS 进行安全传输以发送 Cookie,否则将其设置为 0 表示可以通过常规 HTTP 发送 Cookie。
Example
下面给出的 PHP 脚本会检查 Cookie 名称为 username 已经设置,如果已被设置,则会取回其值。如果未设置,则会设置一个新的 Cookie username 。
<?php
if (isset($_COOKIE['username'])) {
echo "<h2>Cookie username already set:" . $_COOKIE['username'] . "</h2>";
} else {
setcookie("username", "MohanKumar");
echo "<h2>Cookie username is now set</h2>";
}
?>
从 Apache 服务器的文档根文件夹运行此脚本。您应会看到此消息 −
Cookie username is now set
如果重新执行此脚本,则现在已设置 Cookie。
Cookie username already set: MohanKumar
浏览器的开发者工具是非常有用的工具。您可通过该工具设置、取回、删除 Cookie。由上述程序设置的 Cookie 可在浏览器的开发者工具的“应用程序”选项卡下查看。
如下面的 foreach 循环会取回所有 Cookie −
<?php
$arr=$_COOKIE;
foreach ($arr as $key=>$val);
echo "<h2>$key=>$val </h2>";
?>
以下脚本包含一个 HTML 表单。它会将表单数据发送至 setcookie.php 脚本,该脚本会使用从 $_POST 数组取回的数据设置 Cookie。
以下代码会呈现 HTML 表单 −
<form action="setcookie.php" method="POST">
<input type="text" name="name">
<input type="text" name="age">
<input type="submit" name="Submit">
</form>
SetCookie.php 会读取表单数据并设置 Cookie。
if (isset($_POST["submit"]) {
setcookie("name", $_POST["name"]);
setcookie("age", $_POST["age"]);
}
我们可通过另一个 getcookie.php 代码取回所设置的 Cookie。
if (isset($_COOKIE["name"])
echo "Cookie: name => " . $_COOKIE["name"]. "<br>";
if (isset($_COOKIE["age"])
echo "Cookie: age => " . $_COOKIE["age"]. "<br>";
Accessing Cookies with PHP
PHP 提供了许多访问 Cookie 的方法。最简单的方法是使用 $_COOKIE 或 $HTTP_COOKIE_VARS 变量。以下示例将访问上述示例中设置的所有 Cookie。
<?php
echo $_COOKIE["name"]. "<br />";
/* is equivalent to */
echo $HTTP_COOKIE_VARS["name"]. "<br />";
echo $_COOKIE["age"] . "<br />";
/* is equivalent to */
echo $HTTP_COOKIE_VARS["age"] . "<br />";
?>
您可以使用 isset() 函数检查 Cookie 是否已经设置。
<?php
if( isset($_COOKIE["name"]))
echo "Welcome " . $_COOKIE["name"] . "<br />";
else
echo "Sorry... Not recognized" . "<br />";
?>
Deleting the Cookies
要删除 Cookie,请使用在浏览器已经过期的日期设置 Cookie,以便浏览器触发 Cookie 删除机制。
Example
请看以下示例:
<?php
setcookie("username", "", time() - 3600);
echo "<h2>Cookie username is now removed</h2>";
?>
浏览器会显示以下响应 −
Cookie username is now removed
您还可以通过在 Cookie 名称中使用数组符号来设置数组 Cookie。
setcookie("user[three]", "Guest");
setcookie("user[two]", "user");
setcookie("user[one]", "admin");
如果 Cookie 名称包含句点 (.),则 PHP 会将它们替换为下划线 (_)。
虽然 Cookie 概念的主要目的是帮助 Web 开发者提供更为个性化、更为便捷的用户体验,但它可能会对您的隐私和个人信息构成风险。
在某些情况下,如果你不接受应用的 cookies,应用可能会拒绝你完全访问。在这种情况下,建议定期清理浏览器缓存中的 cookie 相关数据。