PHP - Cookie



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

  • 当客户端第一次发送请求时,服务器会在其响应中包含一小段数据作为 Cookie。PHP 提供了 **setcookie()** 方法来在响应中注入 Cookie。

  • 此 Cookie 数据作为文本文件存储在客户端的机器中。在相同客户端的后续访问中,这些 Cookie 将作为 **请求** 标头的部分内容包含在内。

  • 服务器使用 PHP 超全局变量“$_COOKIE”填充客户端请求中存在的全部 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=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 的名称和值。上面的 Cookie 可以使用 $HTTP_COOKIE_VARS["name"] 访问。

如何在 PHP 中设置 Cookie?

PHP 包含 **setcookie** 函数来创建 Cookie 对象,以便与 HTTP 响应一起发送到客户端。

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

参数

以下是所有参数的详细信息:

  • **名称** - 设置 Cookie 的名称,并存储在名为 HTTP_COOKIE_VARS 的环境变量中。此变量用于访问 Cookie。

  • **值** - 设置命名变量的值,它是您实际要存储的内容。

  • **过期时间** - 指定自 1970 年 1 月 1 日 00:00:00 GMT 以来以秒为单位的未来时间。在此时间之后,Cookie 将变得不可访问。如果未设置此参数,则 Cookie 将在 Web 浏览器关闭时自动过期。

  • **路径** - 指定 Cookie 有效的目录。单个正斜杠字符允许 Cookie 对所有目录有效。

  • **域** - 可用于在非常大的域中指定域名,并且必须包含至少两个句点才能有效。所有 Cookie 只对创建它们的宿主和域有效。

  • **安全** - 可以设置为 1 以指定 Cookie 应仅通过使用 HTTPS 的安全传输发送,否则设置为 0,这意味着 Cookie 可以通过常规 HTTP 发送。

示例

下面给出的 PHP 脚本检查名为 **username** 的 Cookie 是否已设置,如果已设置,则检索其值。否则,将设置一个新的 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 可以在浏览器开发者工具的“应用程序”选项卡下查看。

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 />";

   /* 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 />";
?>

删除 Cookie

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

示例

请查看以下示例:

<?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 开发人员提供更个性化和便捷的用户体验,但它可能会对您的隐私和个人信息构成风险。

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

广告