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 

注意:cookie 的一部分在发送 cookie 时会自动进行 urlencoded,而在接收时会自动解码并分配给与 cookie 名称同名的变量。如果您不想这样做,可以使用setrawcookie()函数。
注意:setrawcookie()与setcookie()完全相同,只是cookie值在发送时不会自动进行urlencoded到浏览器。