PHP7设置和删除cookie

时间:2022-06-01 14:10:46

PHP设置和删除cookie都是使用setcookie函数:

bool setcookie ( string $name [, string $value = "" [, int $expire = 0 [, string $path = "" [, string $domain = "" [, bool $secure = FALSE [, bool $httponly = FALSE ]]]]]] )
  • $name:cookie名称
  • $value:cookie值,默认值为“”
  • $expire:cookie失效时间,默认值为0
  • $path:cookie所在路径,默认值为当前路径
  • $domain:cookie所在域名,默认值为“”
  • $secure:是否只允许在https传输,默认值为FALSE
  • $httponly:是否只允许http读取,默认值为FALSE

注意:setcookie()函数一定要在有输出之前执行。

设置Cookie

基本用法

<?php
$value = 'cookievalue';
setcookie("mycookie", $value);
?>

设置失效时间

cookie失效时间是一个Unix的时间戳,从1970年1月1日00:00:00 UTC开始算的秒数。一般情况下,$expire值会使用time()函数加上将要失效的秒数。

<?php
$value = 'cookievalue';
setcookie("mycookie", $value, time() + 3600);
?>

这里表示mycookie将会在一个小时后失效。

设置cookie路径

如果$path没有设定值,它默认为当前目录。设置cookie的访问目录,会限制cookie的访问范围,如设置$path值为:

  • "/":表示整个域名下的url都是可以访问到设置的cookie
  • "/test/":表示只有url为/test以及/test/的所有子孙目录都是可以访问到此cookie

示例:

<?php
$value = 'cookievalue';
setcookie("mycookie", $value, time() + 3600,"/");
?>

设置访问域名

有些人可能会奇怪为什么还要设置域名呢,莫非还可以设定为其他域名?

设置域名分两种情况:

  1. 空值:如果没有设置域名,默认为空值,cookie只能由当前设置cookie的域名访问
  2. 显示设置域名:如设置域名为"example.com",那么“www.example.com”,"demo.example.com"也是可以访问到此cookie,即允许在子域名共享cookie。
<?php
$value = 'cookievalue';
setcookie("mycookie", $value, time() + 3600,"/","example.com");
?>

设置$secure和$httponly

这两个参数用于控制http访问域名的方式:

  • $secure为true时,只允许cookie在https上传输
  • $httponly为true时,只允许http(s)访问,不允许其他脚本读取,如javascript。

设置cookie建议

  • 建议设置cookie显式设置cookie的访问路径
  • 出于安全考虑,把httponly设置为true。如果使用的是https,把secure设置为true

删除Cookie

设置完cookie后,可以使用$COOKIE变量来获取已设置的cookie。

<?php
// 输出某个cookie
echo $_COOKIE["mycookie"];

// 查看所有的cookie
print_r($_COOKIE);
?>

删除cookie,也是使用setcookie()函数,只需要把cookie的失效时间设置为当前时间之前即可。一般可以使用time()减去一定的秒数

<?php
setcookie("mycookie", "", time() - 3600);
?>

如果设置cookie时设置了其他参数,那么需要在有访问到cookie的url上删除cookie

<?php
setcookie("mycookie", "", time() - 3600, "/demo/", "example.com", 1);
?>

很多出现删不了cookie的原因,可能就是cookie设定了其他参数,如$path。

循环删除cookies

$past = time() - 3600;
foreach ( $_COOKIE as $key => $value )
{
    setcookie( $key, $value, $past, '/' );
}