- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
请解释如何session_start()
功能有效。
我不明白在 php 中启动 session 时的操作顺序。尝试解释。
HTTP 是一种客户端-服务器架构。这意味着浏览器发送请求,服务器处理请求并返回响应。这些操作中的每一个都有适当的标题。
我检查了(用 headers_list()
)当我想开始 session 时服务器发回了哪些 header 及其答案。其中还有标题
Set-Cookie: PHPSESSID=7f4cbf53fbcd4717792447f32da7dba8
看起来一切正常,服务器命令浏览器设置cookie。
但是。要开始 session ,我必须包含 session_start()
函数在页面代码的开头。所以这个函数是在浏览器开始解析页面的时候启动的。浏览器遇到php开始标签<?php
其次是 session_start()
功能。它立即将控制权委托(delegate)给服务器。而服务器现在才启动该功能。只有当它已经将包含所有 header 的页面发送到浏览器时。
所以我不明白服务器如何发送Set-Cookie
在浏览器开始解析页面并满足 session_start()
之前的 header 功能?它怎么知道必须输入 Set-Cookie
命令前的标题 session_start()
被执行?还是我误解了流程?
最佳答案
我将使用 Apache 作为服务器来回答。
当向服务器请求页面时,Apache 将其路由到正确的文档。
如果该特定文档类型与 SAPI 相关联,则控制权将归属于该 SAPI。对于 PHP 脚本,这通常是 PHP 的 Apache 模块。
您的 PHP 然后由 SAPI 执行。当您调用 session_start()
时,PHP 会做一些事情:
它检查客户端是否发送了一个以 session_name()
命名的 cookie。该 cookie 包含 session ID。如果它不存在,它会使用新的 session ID 创建它。
它从 session 提供程序加载与该 session ID 关联的 session 数据(默认提供程序将 session 数据作为包含序列化 session 数据的文件存储在服务器的临时文件夹中)并使其在 $_SESSION
super 全局。
它注册一个关闭回调以通过提供者保存 session 数据。
然后您的脚本继续其正常的执行流程,输出被发送回 Apache 以发送给客户端。
session 完全由 SAPI 处理。 除了将控制权交给 SAPI 之外,Apache 什么都不做。
大多数 PHP 安装都启用了输出缓冲,它将所有输出( header 和正文)存储到缓冲区中,直到它被刷新到 Apache(通过 ob_flush()
显式或隐式地在您的结束时脚本)。
如果输出缓冲打开,您可以在第一次刷新之前的任何地方调用 session_start()
,因为 PHP 会在发送正文之前发送 header 。
在新 session 的情况下(发送 cookie 时),客户端是否仅在页面执行后收到 session ID 无关紧要:它将在下一个请求中使用它。 session ID 是恢复 session 数据的关键。如果有人窃取了您的 session ID 而您又没有进行服务器端检查,您的 session 数据就会受到损害。
更多信息,欢迎阅读 another one of my answers.
关于php - session_start() 函数如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9560240/
我有一个顶部导航栏,位于外部 PHP 文件内,该文件通过包含“topnav.php”链接到主页上的适当位置;这样,当我需要更改 href=""时,我不需要浏览每个页面。我还用它来显示 -> 登录身份:
我正在尝试将 Sessions 与 PHP 一起使用,我在 index.php 的开头使用 session_start(); 启动它们,但收到以下错误消息: Warning: session_star
我开始一个新 session :session_start();然后我像这样设置一些 session 变量: $_SESSION['name']=$_POST['name']; 和一些其他变量。 在页
我已经环顾了这个问题 - 但似乎我能找到的只是那些在连接到本地数据库或其他东西时遇到问题的人(不太确定)。我在我的网站上遇到了问题(任何时候我对具有 session_start() 的文件进行 aja
我正在编写一个登录脚本,但是由于我没有对/tmp 文件夹的写权限,所以我又创建了一个并将 session.dave_path 设置为新文件夹。 我一直在终端上测试脚本,文件夹获得了一个新条目,但是当我
我应该在何时何地使用 PHP 中的 session_start()? 例如,假设我有一个登录脚本,它设置了一个 session 变量来判断用户是否登录。然后我必须将 session_start() 放
我有一个启动 session 的 php 文件,后面是一些 html。后来我使用 include "some_file.php" 包含另一个文件。 some_file.php 具有 php 和 mys
我目前正在尝试将我的网站从我机器上的本地主机移动到我的网络服务器。还有一个问题。 一切正常,除了用于管理的登录表单。 起初我以为是 not-saving-as-utf-8-without-BOM 问题
我应该在何时何地使用 PHP 中的 session_start()? 例如,假设我有一个登录脚本,它设置了一个 session 变量来判断用户是否登录。然后我必须将 session_start() 放
当我在代码中使用 session_start() 时,我的 session 设置正确,当我运行代码并登录时,它使我保持登录状态并且一切正常,但是当我在位于顶部的 PHP 代码下面添加 HTML 时页面
我的代码有问题。这是我按照教程制作的登录/注册脚本。 我遇到的问题是,我希望脚本仅在用户输入正确的登录详细信息时回显“已登录”,但即使我没有输入任何登录详细信息,它仍然会回显“已登录”。我检查了它,如
我使用 php 和 mysql 创建了一个登录表单, 这是登录后应该出现的页面: 我添加了此代码以在用户未登录时禁用对该页面的访问。我的问题是,添加此代码后,我无法使用以前可以登录的用户登录。我
我希望你做得很好,我显然正在用登录帐户制作这个网站,我已经在本地数据库和服务器数据库中注册了我的用户。我的 HTML/PHP 代码在运行时没有显示任何错误。我已经检查了我的数据库连接。这是正确的。该网
我正在尝试使用 php 启动 session ,但我总是收到此错误: Fatal error: Call to undefined function session_start() in /www/t
我对 session_start() 有一些问题; 我知道在 session_start() 之前不应该输出任何东西;声明 但是我在我的脚本中找不到问题 索引.php: 但我总是 g
我一直在经历一些 $_SESSION示例,我有点困惑,我应该使用 session_start()每次访问或设置之前 $_SESSION['variable']或者我应该只使用 session_star
请解释如何session_start()功能有效。 我不明白在 php 中启动 session 时的操作顺序。尝试解释。 HTTP 是一种客户端-服务器架构。这意味着浏览器发送请求,服务器处理请求并返
我正在寻找一种处理 session_start 错误的通用方法,而不是一种处理特定错误的方法。可能会发生许多错误,例如 session 目录已满,这会导致 fatal error 。我想要一种方法来捕
有点奇怪的问题,好的,这是我的设置... domain.com 调用从 sub.domain.com 上的 Iframe 读取数据 sub.domain.com 对 sub.domain.com/ca
我正尝试在我网站的标题页中开始 session 。但似乎可能存在某种错误,因为它失败并出现以下错误: Warning: session_start() [function.session-start]
我是一名优秀的程序员,十分优秀!