【发布时间】:2010-03-17 09:18:28
【问题描述】:
为什么我可以在没有任何准备的情况下使用setcookie,而在使用$_SESSION之前需要session_start()?而且我认为他们所做的工作是相似的。
【问题讨论】:
为什么我可以在没有任何准备的情况下使用setcookie,而在使用$_SESSION之前需要session_start()?而且我认为他们所做的工作是相似的。
【问题讨论】:
因为setcookie()定义了一个 cookie 与其余的 HTTP 标头一起发送。这与session_start() 所做的完全不同,例如根据通过 GET 或 POST 请求或通过 cookie 传递的会话标识符创建会话或恢复当前会话。
第一个只是在标题中添加一些内容并将其发送到浏览器,而另一个获取会话 ID 来自 $_COOKIEs 或 $_GET 或 $_POST 然后尝试在session_save_path 中查找会话文件,并在找到时将其值反序列化为 $_SESSION,如果没有,则创建一个新会话,可能在设置会话 ID 的过程中使用setcookie。
见chapter on Sessions in the PHP Manual.
编辑 就像@Felix 在下面正确指出的那样,会话不一定保存在文件中。但这并不重要,因为参数保持不变:session_start 将找到并(重新)初始化您的会话数据,而setcookie 只是按照名称的含义进行操作。
【讨论】:
解释见我之前的回复。 如果您只是不想调用 start_session() 函数,请查看 php.ini 中的此设置: session.auto_start
【讨论】:
会话数据不一定像 Gordon 所说的那样存储在文件中。使用session_set_save_handler(),您可以定义自己的后端来存储值,例如在数据库中。
所有这些数据检索都由session_start() 处理。这样您就可以轻松更改后端而不会破坏您的应用程序。
注意:这只是session_start() 的一个原因,而且它的作用远不止设置 cookie。
【讨论】:
会话数据不一定像 Gordon 所说的那样存储在文件中。使用session_set_save_handler(),您可以定义自己的后端来存储值,例如在数据库中。
所有这些数据检索都由session_start() 处理。这样您就可以轻松更改后端而不会破坏您的应用程序。
注意:这只是session_start() 的一个原因,而且它的作用远不止设置 cookie。
【讨论】: