【问题标题】:How Session Works?会话如何工作?
【发布时间】:2011-02-26 15:31:31
【问题描述】:

任何人都可以向我解释会话在 PHP 中是如何工作的。例如。 3 个用户登录了 gmail。服务器如何识别这 3 个用户。这背后的内部流程是什么。

【问题讨论】:

    标签: php apache


    【解决方案1】:

    PHP 会话如何工作

    • 首先 PHP 创建一个唯一的标识符号(一个 32 的随机字符串 十六进制数,例如 3c7foj34c3jj973hjkop2fc937e3443) 个人会议。

    • PHPSESSID cookie 将该唯一标识号传递给用户浏览器以保存该编号。

    • 正在向服务器创建一个新文件,其名称与具有 sess_ 前缀的唯一标识号的名称相同(即 sess_3c7foj34c3jj973hjkop2fc937e3443。)

    • Web 浏览器随每个请求将该 cookie 发送到服务器。

    • 如果 PHP 从 PHPSESSID cookie 中获取唯一标识号(在每个请求中),则 PHP 在临时目录中搜索并比较该编号和文件名。如果两者相同,则检索现有会话,否则为该用户创建一个新会话。

    当用户关闭浏览器或离开网站时,会话将被破坏。服务器也在预定的会话时间后终止会话这些是使用 PHP 处理会话的简单机制。我希望这篇文章能帮助你了解 PHP SESSION 是如何工作的。

    有关详细信息,请参阅本文。 How Does PHP Session Works

    【讨论】:

      【解决方案2】:

      在标题顶部定义的 session_start() 函数...这将生成一个唯一编号。会话是与服务器通信的方式。服务器端和客户端的会话存储。浏览器将会话存储在 tmp 文件或 cookie 中。

      Cookies 保留会话名称和值,它不放置会话数据。会话保存在服务器端的数据。当客户端向服务器发送请求时...服务器获取会话 ID 并将数据返回给客户端。 session_id 是从服务器端生成的,session_id 是识别请求来自哪里的方式。

      【讨论】:

        【解决方案3】:

        session_start() 函数生成一个随机会话 ID 并将其存储在用户计算机上的 cookie 中(这是唯一实际存储在客户端的会话信息。) cookie 的默认名称是 PHPSESSID,尽管这可以在服务器上的 PHP 配置文件中进行更改(但是,大多数托管公司将不理会它。)要在 PHP 代码中引用会话 ID,因此您将引用变量 $PHPSESSID(它是一个 cookie 名称;请记住从饼干?) 您的敏锐头脑可能想知道当您第二次通过页面并再次到达 session_start( ) 函数时会发生什么。 PHP 知道已经有一个正在进行的会话,因此忽略 session_start() 的后续实例

        【讨论】:

          【解决方案4】:

          会话由两个部分组成,客户端会话 ID服务器端会话数据。客户端可以将会话 ID 作为 URL 参数、cookie 甚至 HTTP 标头发送到服务器。 然后,服务器使用此会话 ID 来查找适当的会话数据以返回给客户端。

          您可以通过各种session_ functions 调整会话行为。

          【讨论】:

          • 如果会话由 cookie 和服务器端会话数据“组成”,即使没有 cookie,会话如何工作?
          【解决方案5】:

          第一次打开网页(URL)时,您的浏览器会向该服务器发送请求,此时,标头不包含任何要包含的 cookie 或会话,然后,在服务器响应 Web 浏览器之后(用户代理)服务器可能会发送cookie或会话,此时浏览器将它们保存起来以备下次请求。

          现在,当重新加载页面时,浏览器将cookie发送回服务器(包含在请求的标头中),然后服务器可以访问并验证它。

          对于会话:它是一个临时cookie,将在关闭窗口后终止。

          PHP 会话 PHP 为一个名为 PHPSESSID 的键值对使用会话 cookie,服务器依赖于该键的值并使用 PHPSESSID 的值找到等效的键值对。使用这种方法可以防止某种攻击,例如解密cookie的实际值,因为cookie保存了客户端PC中可以看到的所有键值对,而会话取决于一个键值对。

          【讨论】:

            【解决方案6】:

            会话是服务器端会话数据客户端 cookie 的组合,客户端 cookie 只包含对正确的引用服务器上的数据。因此,当用户访问网站时,他们的浏览器会将参考代码发送到服务器,服务器会加载相应的数据。

            这似乎比仅仅拥有一个包含所有数据的客户端 cookie 有点笨拙,但有一些优点:

            • 您的服务器端会话数据可以包含 非常大量的数据,没有 麻烦 - 客户端 cookie 是 大小有限
            • 您的客户端 cookie 包含 只是一个小参考 代码 - 因为这个 cookie 每个都被传递 有人访问您的页面的时间 网站,您节省了很多 通过不传输大带宽 客户端 cookie 周围
            • 会话数据更加安全 - 只有你能够操纵它, 与客户端 cookie 不同 所有人都可以编辑

            同样重要的是要注意会话只持续到用户关闭浏览器,而 cookie 可以配置为持续更长时间。但是,除了上述之外,对于大多数用途而言,会话数据和 cookie 数据之间并没有太大区别。

            The following 是一篇非常好的文章,它解释了会话和 cookie 在 PHP 中的工作原理。

            【讨论】:

            • 服务器端文件你的意思是?
            • 啊,是的,就是为了指出这一点。正如 Jacob Relkin 所指出的,我认为会话数据可能更有意义。我现在将其编辑。干杯
            • @learner 确实如此,除非 PHP 设置为附加一个丑陋的 PHPSESSID GET var。
            • @RusselDias 我要指出一件事......当你说只有你能够操纵它时,它并不是 100% 正确的。任何可以访问您的tmp 文件夹的人也可以(想想共享主机)。最好更改会话保存路径php.net/manual/en/function.session-save-path.php
            • @AdityaMP 您有一个会话超时 (session.gc_maxlifetime),如果会话在一定时间内处于非活动状态,则会删除该会话。
            【解决方案7】:

            会话非常简单。

            当我登录到您的网站时,PHP 会设置一个带有“会话 ID”的标准浏览器 cookie — 通常是一个字母数字字符串,例如 63f1a67cf52b5d2bbd0cbef45e18b242

            所有 cookie 一样,我的浏览器会在我发出的每个请求时将该 cookie 发送回您的服务器。因此,您的应用程序现在知道带有 63f1a67cf52b5d2bbd0cbef45e18b242 会话 ID 的每个请求都来自我。

            因此,如果您需要存储有关我的任何信息,可以在63f1a67cf52b5d2bbd0cbef45e18b242 下跟踪它。默认情况下,PHP 将此信息存储在 /tmp/ 目录中的文件中,尽管您可以覆盖它并将其存储在您喜欢的任何位置(例如,在数据库中)。重要的是将该会话 ID 与特定用户相关联。

            我不想把事情过分简单化。有一些担忧(例如,如果入侵者看到我未加密的会话 ID 并开始自己使用它会怎样——他可能会开始伪装成我),并且有一些方法可以缓解这些担忧。但是将会话 ID 存储在 cookie 中并使用它来识别存储在服务器上的有关我的信息的基本机制是非常普遍的。

            【讨论】:

            • 先生,如果我禁用浏览器 cookie 会发生什么?
            • 通常情况下,您将无法使用会话。 PHP 确实有一个设置,它会在链接被写入页面时自动重写链接,以将会话 ID 作为额外参数包含在内,这当然不需要 cookie,但确实需要 PHP 在生成内容时对其进行解释(应该感觉有点吓人)。
            • 先生,服务器如何识别每个用户的请求。它会保存在哪里吗?
            • 服务器通过cookie中存储的值来识别请求。请记住,所有 cookie 都会随所有请求一起传输。信息保存在服务器上的位置取决于您。正如我所提到的,PHP 默认将其存储在 /tmp/ 的文件中。
            【解决方案8】:

            饼干。
            或url中的参数。 而这个互联网过程被称为HTTP协议。

            【讨论】:

              【解决方案9】:

              我认为 Gmail 使用的是 Python,而不是 PHP。

              PHP 默认将其会话写入/tmp 目录。它可以配置为将会话存储在数据库中。

              它通过 cookie 识别会话,但也可以配置为传递查询字符串,但它非常难看。

              【讨论】:

                猜你喜欢
                • 2016-11-20
                • 1970-01-01
                • 2012-01-15
                • 2011-12-16
                • 1970-01-01
                • 2012-03-03
                • 2011-11-10
                相关资源
                最近更新 更多