PHP - Cookie


万维网由 HTTP 协议提供支持,HTTP 协议是一种无状态协议。Cookie 的机制帮助服务器维护以前请求的信息。PHP 透明地支持 HTTP Cookie

  • 当客户端首次发送其请求时,服务器会以 Cookie 的形式包含一小段数据及其响应。PHP 提供了 setcookie() 方法,用于在响应中注入 Cookie
  • cookie 数据以文本文件的形式存储在客户的机器中。在对同一客户端的后续访问中,这些 Cookie 将作为请求标头的一部分包含在内。
  • 服务器使用客户端请求中存在的所有 cookie 填充 PHP 超全局变量 “$_COOKIE”。

本章将教您如何设置 cookie、如何访问以及如何删除。

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=qikepu.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: zh
Accept-Charset: iso-8859-1,*,utf-8
Cookie: name=xyz

然后,PHP 脚本将可以访问环境变量 $_COOKIE $HTTP_COOKIE_VARS[] 保存所有 cookie 名称和值。上述 cookie 可通过以下方式访问 $HTTP_COOKIE_VARS["name"]

PHP 设置 cookie

PHP 包含 setcookie 函数,用于创建要与 HTTP 响应一起发送到客户端的 cookie 对象。

setcookie(name, value, expire, path, domain, security);

参数

这是所有参数的详细信息 -

参数 说明
name  这将设置 Cookie 的名称,并存储在名为 HTTP_COOKIE_VARS 的环境变量中。此变量在访问 Cookie 时使用。
value 这将设置命名变量的值,并且是您实际要存储的内容。
expire 指定自 1970 年 1 月 1 日 00:00:00 GMT 以来的未来时间(以秒为单位)。在此之后,cookie 将变得无法访问。如果未设置此参数,则 Cookie 将在 Web 浏览器关闭时自动过期。
path 指定 Cookie 有效的目录。单个正斜杠字符允许 cookie 对所有目录有效。
domain 这可用于在非常大的域中指定域名,并且必须包含至少两个句点才能有效。所有 Cookie 仅对创建它们的主机和域有效。
security 可以将其设置为 1 以指定 Cookie 只能通过使用 HTTPS 的安全传输发送,否则设置为 0,这意味着 Cookie 可以通过常规 HTTP 发送。

示例

下面给出的 PHP 脚本检查名为 username cookie 是否已设置,如果是,则检索其值。如果没有,则设置新的 Cookie 用户名。

<?php
   if (isset($_COOKIE['username'])) {
      echo "<h2>Cookie用户名已设置:" . $_COOKIE['username'] . "</h2>";
   } else {
      setcookie("username", "MohanKumar");
      echo "<h2>Cookie用户名现已设置</h2>";
   }
?>

从 Apache 服务器的文档根目录运行此脚本。您应该会看到此消息 -

Cookie用户名现已设置

如果重新执行此脚本,则 Cookie 现在已设置。

Cookie用户名已设置:MohanKumar

浏览器的开发人员工具是一个非常有用的工具。您可以在它的帮助下设置、检索和删除 cookie。上述程序设置的 cookie 可以在浏览器开发者工具的 应用(Application) 选项卡下查看。

PHP cookies

如下所示的 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>";

PHP 访问 Cookie

PHP 提供了许多访问 cookie 的方法。最简单的方法是使用 $_COOKIE$HTTP_COOKIE_VARS 变量。以下示例将访问上述示例中设置的所有 Cookie

<?php
   echo $_COOKIE["name"]. "<br />";

   /* 等于 */
   echo $HTTP_COOKIE_VARS["name"]. "<br />";

   echo $_COOKIE["age"] . "<br />";

   /* 等于 */
   echo $HTTP_COOKIE_VARS["age"] . "<br />";
?>    

您可以使用 isset() 函数来检查是否设置了 cookie

<?php
   if( isset($_COOKIE["name"]))
      echo "Welcome " . $_COOKIE["name"] . "<br />";

   else
      echo "Sorry...无法识别" . "<br />";
?>

删除 Cookie

要删除 Cookie,请将 Cookie 设置为已过期的日期,以便浏览器触发 Cookie 删除机制。

请看下面的例子 -

<?php
   setcookie("username", "", time() - 3600);
   echo "<h2>Cookie用户名现已删除</h2>";
?>

浏览器显示以下响应 -

Cookie用户名现已删除

您还可以通过在 cookie 名称中使用数组表示法来设置数组 cookie

setcookie("user[three]", "Guest");
setcookie("user[two]", "user");
setcookie("user[one]", "admin");

如果 cookie 名称包含点 ( ),PHP 会用下划线 ( ) 替换它们。

尽管 cookie 概念背后的主要目的是帮助 Web 开发人员提供更个性化和便捷的用户体验,但它可能会对您的隐私和个人信息构成风险。

在某些情况下,应用程序可能会拒绝您不接受他们的 cookie 的完全访问权限。在这种情况下,建议定期从浏览器的缓存中清除与 cookie 相关的数据。