【问题标题】:How does PHP set the PHPSESSID into $_COOKIE superglobal variable without using the function setcookie() or setrawcookie()?PHP 如何在不使用 setcookie() 或 setrawcookie() 函数的情况下将 PHPSESSID 设置为 $_COOKIE 超全局变量?
【发布时间】:2018-03-23 08:26:48
【问题描述】:

我正在学习 PHP 中最重要且最难理解的概念,即。 “会话和 Cookie”

据我了解,只能使用setcookie()setrawcookie() 函数将cookies 设置到浏览器中。

根据我对会话过程的理解,它的工作方式如下。

  • 每个会话都使用 session_start( ) 函数启动。
  • session_start( ) 函数必须位于页面上的任何 HTML(包括空行)之前。
  • session_start() 函数生成一个随机的 Session Id,并将其存储在用户计算机上的 cookie 中(这是唯一实际存储在客户端的会话信息。)
  • cookie 的默认名称是PHPSESSID。为了在我的 PHP 代码中引用会话 ID,我将引用变量 $PHPSESSID(它是一个 cookie 名称)

如果我在上述解释中的任何地方理解有误,请纠正我。

我的疑问是会话在$_COOKIE superglobal 中设置了一些值,它无法使用setcookie() or setrawcookie() 中的任何函数,那么会话ID 仍然如何存储为cookie 变量?

如果我假设会话 id 设置为 cookie 变量,并且可能已在内部调用 setccookie() or setrawcookie(),那么在调用任一函数 setccookie() or setrawcookie() 设置 cookie 值时设置的参数值是什么?

谢谢。

【问题讨论】:

  • 不,你不想引用$PHPSESSID。要获取会话 ID,请不带参数调用 session_id()。它将返回当前会话。
  • 是的,session_start 将创建一个 $_COOKIE 值。不,您不应该通过各种 cookie 函数直接与此值交互 - 让 PHP 处理它。
  • @ceejayoz Nitpick:session_start 不会在 $_COOKIE 中创建任何内容;它需要另一个往返才能让 cookie 出现在那里...... :-P
  • 从技术上讲,setcookie 没有在浏览器上设置任何内容。它修改了一个内部 cookie 数组,然后用它告诉浏览器服务器希望它记住一些 cookie。浏览器可以选择完全忽略这一点。
  • 无论如何,这一切都有些学术性,因为会话 ID 甚至可能不会被 cookie 持久化。总而言之,在处理会话时,处理会话 - cookie 是无关紧要的。

标签: php session cookies session-cookies setcookie


【解决方案1】:

cookie 的默认名称是PHPSESSID。为了在我的 PHP 代码中引用会话 ID,我将引用变量 $PHPSESSID

不,它只是 cookie 的名称,它不会被设置为全局变量。您可以访问$_COOKIE['PHPSESSID'] 中的值。但实际上,这根本不应该让您担心,您应该只使用 session_* functions$_SESSION 超全局来与 PHP 的会话 API 进行交互,所使用的底层 cookie 对大多数意图和目的都无关紧要。

...使用setcookie()setrawcookie() 中的任何一个功能都无处可寻...

如果我假设会话 id 被设置为 cookie 变量,并且 setccookie()setrawcookie() 可能已在内部调用...

是的,PHP 正在内部调用 一些 函数来设置 cookie。它可能既不是setcookie 也不是setrawcookie,而是一些设置cookie 的内部C 函数。再说一次,这真的不关你的事。您只需要了解调用session_start 会以某种方式在内部导致设置cookie。

...那么调用setccookie()setrawcookie()函数设置cookie值时设置的参数值是什么?

这些由the various session.cookie_* parameters 确定,您可以通过session_set_cookie_paramsini_set 设置。

【讨论】:

  • "您可以访问 $_COOKIE['PHPSESSID'] 中的值。"可能是!但不要依赖于这样做,因为 cookie 的名称是可配置的。
  • 当然,$_COOKIE[session_name()] 会更正确;但同样,你几乎不需要在那里闲逛。
  • 完全同意。
猜你喜欢
  • 1970-01-01
  • 2023-01-03
  • 2019-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-19
  • 1970-01-01
相关资源
最近更新 更多