PHP 网络函数

PHP setrawcookie() 函数定义要与其余 HTTP 标头一起发送的 cookie,而无需对 cookie 值进行 urlencode 编码。

与其他标头一样,cookie 必须在脚本的任何输出之前发送。这需要在任何输出之前调用此函数,包括 <html> 和 <head> 标记以及任何空白。

设置 cookie 后,可以在下一个页面加载时使用 $_COOKIE 数组。 Cookie 值也可能存在于 $_REQUEST 数组中。

Cookie 是存储在客户端计算机上的文本文件,它们用于跟踪目的。 PHP 透明地支持 HTTP cookie。识别回访用户涉及三个步骤:

  • 服务器脚本向浏览器发送一组 cookie。例如姓名、年龄或 ID 等。
  • 浏览器将此信息存储在本地计算机上以供将来使用。
  • 下次浏览器向 Web 服务器发送任何请求时,它会发送这些 Cookie信息发送到服务器,服务器使用该信息来识别用户。
注意:setrawcookie() 是与 setcookie() 完全相同,只是 cookie 值在发送到浏览器时不会自动进行 urlencode 编码。

语法

setrawcookie(name, value, expires, path, 
          domain, secure, httponly)

//自 PHP 7.3.0 起可用的替代签名
setrawcookie(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 和同一个站点。如果存在任何其他键,则会生成 E_WARNING 级别的错误。这些值与具有相同名称的参数所描述的含义相同。如果未给出任何允许的选项,则它们的默认值与显式参数的默认值相同。

samesite 元素的值应为 None、宽松 或严格。如果省略 samesite 元素,则不会设置 SameSite cookie 属性。

返回值

如果在调用此函数之前存在输出,setrawcookie()将失败并且返回false。

如果setrawcookie()成功运行,它将返回true。这并不表明用户是否接受cookie。

示例:发送cookie

下面的示例展示了如何使用PHP脚本发送设置cookie请求。

<!DOCTYPE html>
<?php
//会话结束时过期
setrawcookie("name", "John Smith");

//1小时后过期
setrawcookie("age", 27, time()+3600);

//1小时后过期-此cookie将可用
//如果通过安全设置则在整个域内
//来自客户端的HTTPS连接
setrawcookie("hobbies", "painting", time()+3600, "/", "", 1);
?>
<html>
<head><title>Setting Cookies</title></head>
   
<body>
  <?php echo "Set Cookies"; ?>
</body>  
</html> 

示例:访问cookie

可以通过$_COOKIE['cookiename']检索cookie的值。考虑下面的示例:

<!DOCTYPE html>
<?php
//1小时后过期
setrawcookie("TestCookie", "CookieValue", time()+3600);
?>

<html>
<head><title>Accessing Cookies</title></head>
   
<body>

  <?php
    if(!isset($_COOKIE["TestCookie"])) {
      echo "This cookie is not set.";
    } else {
      "Value is: ".$_COOKIE['TestCookie'];
    }
  ?>

</body>  
</html> 

示例:删除 cookie

要删除 cookie,可以使用 setrawcookie()将过期日期设置为过去的日期功能。这将触发浏览器中的删除机制。

<!DOCTYPE html>
<?php
//设置过去1小时内的过期日期
//触发浏览器中的删除机制
setrawcookie("TestCookie", "CookieValue", time()-3600);
?>

<html>
<head><title>Deleting Cookies</title></head>
   
<body>
  <?php echo "Deleting Cookies"; ?>
</body>  
</html> 

示例:修改cookie

要修改cookie,只需使用setrawcookie( ) 函数。

<!DOCTYPE html>
<?php
//这会将过期时间修改为2小时
setrawcookie("TestCookie", "CookieValue", time()+7200);
?>

<html>
<head><title>Modifying Cookies</title></head>
   
<body>
  <?php echo "Modifying Cookies"; ?>
</body>  
</html> 

示例:检查 cookie 是否启用

下面的示例可用于检查 cookie 是否启用。首先,尝试使用 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> 

示例:setrawcookie() 和数组

可以通过在 cookie 名称中使用数组表示法来设置数组 cookie。考虑下面的示例:

<!DOCTYPE html>
<?php
//设置cookie数组
setrawcookie("arr[three]", "cookiethree");
setrawcookie("arr[two]", "cookietwo");
setrawcookie("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值进行URL编码,并在接收时自动解码,请改用setcookie()函数。