我正在重构一些代码,发现了一些我从未见过的东西。 该功能用于用户在登录时设置 cookie:
function setUserCookie($name, $value) {
$date = date("D, d M Y H:i:s",strtotime('1 January 2015')) . 'GMT';
header("Set-Cookie: {$name}={$value}; EXPIRES{$date};");
}
现在我已被分配重构代码,我计划使用setcookie
函数,该函数基本上根据 php.net 做同样的事情。
我的问题是:两者之间有什么区别吗,我应该使用哪一个?
注意:这段代码是很久以前写的,所以我假设当时setcookie
不存在?
没有充分的理由不使用 setcookie。上面的代码没有正确编码名称和值,因此这至少是重构的一个主要好处。
这两个函数之间的区别在于,header()
是用于设置 HTTP 标头的通用函数,而 setcookie()
是专门用于设置Set-Cookie
标头的函数。
因此,header()
采用包含完整标头的字符串,而 setcookie()
采用多个特定于 cookie 的参数,然后从它们创建 Set-Cookie
标头。
这是一个不能使用 setcookie 的用例
- 您在 PHP<7.3 上运行网站
- 您必须设置"同一网站"cookie属性
您可以通过利用 setcookie 中的错误来实现这一点,但我不会依赖错误,因为它会随着时间的推移而修复:setcookie('samesite-test', '1', 0, '/; samesite=strict');
或者你可以使用 PHP 标头函数:header("Set-Cookie: samesite-test=1; expires=0; path=/; samesite=Strict");
请注意,设置同站点属性时需要安全选项
一个很大的区别是,setcookie 总是设置 host_only=false,你对此无能为力。
因此,如果出于任何原因必须设置 host_only=true,则必须使用 header 方法。据我所知。
编程方式复制了我认为是setCookie
的确切行为。这是我的实现,如果它对其他人有用的话。
function setUserCookie($name, $value, $expires = 0, $path = "", $domain = "", $secure = false, $http_only = false) {
$value = rawurlencode($value);
date_default_timezone_set('UTC');
$date = date("D, d-M-Y H:i:s",$expires) . ' GMT';
$header = "Set-Cookie: {$name}={$value}";
if($expires != 0) {
$header .= "; expires={$date}; Max-Age=".($expires - time());
}
if($path != "") {
$header .= "; path=".$path;
}
if($domain != "") {
$header .= "; domain=".$domain;
}
if($secure) {
$header .= "; secure";
}
if($http_only) {
$header .= "; HttpOnly";
}
header($header, false);
}
与函数的区别与setCookie
的区别完全不同(更多参数,如自定义过期、路径、域、安全和 httpOnly(。特别是,请注意"header"(false
(的第二个参数,以便可以放置多个cookie,对函数进行不同的调用。