$ _COOKIE []在设置后似乎没有反映出变化

Ken*_*son 4 php cookies

我不记得过去使用过Cookies有很多问题,但我一直在玩,并遇到了一些意想不到的结果.

(我正在运行localhost,因此我的域名设置)

<?php
$sessionCookie = rand();
setcookie("crav_auto_login_cookie", $sessionCookie, false,"/crav/", false);
echo "Cookie Set<br/>";
echo "Cookie equals: ".$_COOKIE["crav_auto_login_cookie"]."<br/>";
echo "should equal: ". $sessionCookie;
?>
Run Code Online (Sandbox Code Playgroud)

这将产生以下输出:

Cookie Set
Cookie equals: 457718770
should equal: 318511886

我显然错过了一些东西,但不确定为什么值不同.是因为cookie是在页面调用时加载的,并且$_COOKIE["crav_auto_login_cookie"]正在从打开页面时调用的实例返回结果而不反映新设置的值?如果是这样的话,为什么呢?

Dan*_*uis 5

setcookie设置标头以发送回客户端以设置cookie.在下一个请求之前,新的cookie将无法在$_COOKIE阵列中访问(包含从客户端发送的cookie ).

以下是用户访问您的网页时事件的简化过程:

  1. 用户的浏览器向您的服务器发送请求.此请求包含标头,包括为您的域为该用户设置的Cookie.PHP填充$_COOKIE(以及$_GET,$_POST基于在此请求中的数据,等等)阵列.
  2. 服务器解析用户的请求,并设置响应.此响应以响应标头开头(包括您自己设置的任何标头header,以及设置的标头setcookie).所有标题必须在任何页面输出之前(正如您可能遇到的那样,如果您在开始输出页面内容后尝试发送更多标题,PHP将给您一个错误).
  3. 服务器发送页面内容(实际上,标题和内容是同一传输的一部分).
  4. 服务器和客户端之间的连接关闭(为了讨论的目的,让我们忽略AJAX).
  5. 客户端解析它收到的标题和内容,根据需要设置cookie,并呈现页面(实际上,这可能很好地与接收页面串行发生).

因此,当客户端接收并处理set-cookie标头时,客户端已经完成与服务器的通信,这就是为什么在下一个请求之前cookie不会出现在PHP中.