【发布时间】:2017-07-12 03:29:32
【问题描述】:
我试图了解 PHP 函数 setcookie() 和 session_set_cookie_params() 之间的区别。
看起来这两个函数执行相同类型的任务,但 setcookie() 可用于创建具有名称和值的 cookie。
我试图理解 PHP 手册,但其中没有指出明显的差异。
谢谢
【问题讨论】:
我试图了解 PHP 函数 setcookie() 和 session_set_cookie_params() 之间的区别。
看起来这两个函数执行相同类型的任务,但 setcookie() 可用于创建具有名称和值的 cookie。
我试图理解 PHP 手册,但其中没有指出明显的差异。
谢谢
【问题讨论】:
session_set_cookie_params(秒)
session_start() 做了两件事,它在服务器上创建一个临时文件来存储会话数据,并且还向用户的浏览器发送一个 cookie。此 cookie 有一个默认过期时间,因此调用 session_set_cookie_params(seconds) 会将 cookie 的默认过期时间更改为您定义的。 cookie 基本上将客户端指向他们的会话,因此需要访问会话。
设置 Cookie()
其中 setcookie() 函数定义了要与其余 HTTP 标头一起发送的 cookie。
【讨论】:
有两种类型的 cookie:
会话 cookie : 这些是 session_set_cookie_params(),它们是临时 cookie 文件,当您关闭浏览器时会被删除。
持久性 cookie: 这是 setcookie(),这些文件保留在浏览器的子文件夹之一中,直到您手动删除它们或您的浏览器根据持久性 cookie 中包含的持续时间删除它们。
例如,如果您希望将 cookie 保存 1 周:
$remembering_timespan = time() + 7 * 24 * 60 * 60;
setcookie('test','username', $remembering_timespan);
【讨论】:
基本上不一样。
对于setcookie
<?php
$value = 'something from somewhere';
setcookie("TestCookie", $value);
setcookie("TestCookie", $value, time()+3600); /* expire in 1 hour */
setcookie("TestCookie", $value, time()+3600, "/~rasmus/", "example.com", 1);
?>
您可以像上面那样设置超时会话的名称和值本身。 至于 session_set_cookie_params:
session_set_cookie_params(
$currentCookieParams["lifetime"],
$currentCookieParams["path"],
$rootDomain,
$currentCookieParams["secure"],
$currentCookieParams["httponly"]
);
您可以在这里http://php.net/manual/en/function.session-set-cookie-params.php设置路径、cookie 本身的到期时间、根域、安全级别和更多参数
通过 PHP 的有效方法如下:
<?php
$currentCookieParams = session_get_cookie_params();
$rootDomain = '.example.com';
session_set_cookie_params(
$currentCookieParams["lifetime"],
$currentCookieParams["path"],
$rootDomain,
$currentCookieParams["secure"],
$currentCookieParams["httponly"]
);
session_name('mysessionname');
session_start();
setcookie($cookieName, $cookieValue, time() + 3600, '/', $rootDomain);
?>
高效的编码器确保在设置参数本身之前设置参数,以便在用户离网时。 cookie 本身已过期。
【讨论】:
使用session_set_cookie_params(),您可以定义 cookie 选项(如生存期等)。如果会话开始,这些值将用于发送到客户端的 cookie。然而,cookie 仅在会话开始时发送,而不是用于来自客户端的任何进一步请求。这意味着在到达[session start time] + [timeout] 之后,客户端将删除 cookie。实际上,您定义了会话的最大生命周期。
而 setcookie() 实际上会重新发送 cookie,无论它是新会话还是现有会话。这意味着每次请求都会更新 cookie,客户端只会在达到 [time of last request] + [timeout] 后将其删除。实际上,您定义了会话不活动的最大时间。
【讨论】:
setcookie() 定义一个 cookie 与其余的 HTTP 标头一起发送。与其他标头一样,cookie 必须在脚本的任何输出之前发送(这是协议限制)。这要求您在任何输出之前调用此函数,包括和标记以及任何空格。
要使 setcookie() 正常工作,您需要为每个请求调用 session_set_cookie_params() 并在 session_start() 之前调用setcookie() 被调用。
【讨论】:
我认为,setcookie() 和 session_set_cookie_params() 函数的区别可能在于 domain.com 和 sub.domain.com。
【讨论】: