【问题标题】:What keeps a php session alive?是什么让 php 会话保持活跃?
【发布时间】:2014-05-19 05:05:09
【问题描述】:

会话是否仅在您每次使用 session_start(); 访问页面时保持活动状态,还是其他页面也保持活动状态?

示例(30 分钟超时):

1

用户使用 session_start();
访问页面 25 分钟后,他们访问另一个 session_start();
页面会话保持活动状态

2

用户使用 session_start();
访问页面 25 分钟后,他们访问了 non-session_start();页面
会话保持活跃

2也是真的吗?

【问题讨论】:

  • 嗯,我们有两个非常不同的答案。
  • PHP session cookie 的过期时间是SESSION,这意味着它将在浏览器会话结束时(浏览器关闭时或在本例中为30 min timeout)被删除,并且域cookie 与创建它的域相同。第 2 条语句为真,因为浏览器在关闭浏览器之前不会删除 cookie。因此,即使在 PHP 文件中没有调用 session_start(),浏览器仍会将 cookie 发送到页面。仅当两个 PHP 文件的域相同时才会发生这种情况。
  • PHP 下的服务器配置也很重要。例如,see Apache session configuration.

标签: php session


【解决方案1】:

调用 session_start() 只会让您的代码访问会话。

使会话保持活跃的是您的浏览器将会话 ID(存储在 cookie 中)发送到服务器,无论您是否使用它。

答案:他们都是真的。

【讨论】:

  • 但它是存储实际会话数据的服务器,它可能会丢弃它,即使浏览器保留其会话cookie。
  • 如果会话服务器重启例如?没错,但这不是问题。
  • 会话数据不是无限存储的。 PHP 会定期丢弃旧会话数据,请参阅session.gc_maxlifetime
  • 我同意,但这又不是问题。
【解决方案2】:

如果您希望在所有页面上都有会话,则应在所有页面上调用 session_start()

因此,1CORRECT2CORRECT

【讨论】:

  • 你回答的第一行是真的。但是 2 是正确的,因为当您不调用 session_start() 时会话不会被破坏。
  • 鉴于 30 分钟超时的规定,2 是正确的。
【解决方案3】:

每当您访问具有session_start() 的页面时,您的浏览器中总会设置一个会话cookie。如果网站使用 PHP,则 cookie 名称将为 PHPSESSID(尽管名称可以更改)。此会话 cookie 包含一个会话 ID,可帮助浏览器保持与服务器的会话。

您可以通过浏览任何有您会话的网站手动检查,然后删除您的浏览器cookie,您的会话将丢失。

在你的情况下,1 和 2 都是正确的。

2 是正确的,因为用户已经访问了具有 session_start() 的页面,并且您的会话 ID 将在接下来的 30 分钟内设置,即使您访问的页面没有会话,它也会存在。

注意:但是如果您将访问的页面包含session_destroy(),您的会话将被销毁。

【讨论】:

  • 感谢 Joshua - 这很有意义,伙计。
【解决方案4】:

session_start() 是 php 访问 session 以及将 session cookie 发送到客户端浏览器的内部机制。

  1. 案例 1 为真:因为用户使用 session_start() 访问了一个页面,然后访问了另一个类似的页面。
  2. 仅当两次访问之间的会话超时时间大于 25 分钟时,情况 2 才成立。

在情况 2 中,服务器不会发送任何会话 cookie,它是一个在请求头中包含 cookie 的浏览器。

【讨论】:

    【解决方案5】:

    它不必对网页做任何事情,会话通过会话 ID 与您的浏览器交互。

    PHP 生成的会话 ID 是唯一的、随机的,几乎无法猜测,因此非常 攻击者很难访问或更改会话数据。此外,由于会话数据被存储 在服务器上,它不必随每个浏览器请求一起发送。

    要在脚本中启动 PHP 会话,只需调用 session_ 开始()函数。如果这是一个新会话,此函数会为该会话生成一个唯一的 SID,并将其作为名为 PHPSESSID 的 cookie 发送到浏览器(默认情况下)。 但是,如果浏览器发送了一个 PHPSESSID cookie 到服务器,因为会话已经存在, session_start() 使用这个现有的会话: session_start();

    【讨论】:

      【解决方案6】:

      这是文档中的相关部分

      当访问者访问您的站点时,PHP 将自动检查(如果 session.auto_start 设置为 1)或根据您的请求(显式通过 session_start())检查是否已随请求发送了特定会话 ID。如果是这种情况,则重新创建之前保存的环境

      http://www.php.net/manual/en/intro.session.php

      session_start() 根据通过 GET 或 POST 请求或通过 cookie 传递的会话标识符创建会话或恢复当前会话

      http://www.php.net/manual/en/function.session-start.php

      这意味着如果您不调用session_start,会话将不会恢复,并且到期不会延长。

      【讨论】:

        【解决方案7】:

        在本例中,30 分钟的 PHP 会话寿命是一种“技巧问题”因素。默认且几乎通用的会话寿命为 1440 秒,即 24 分钟。所以对于大多数人来说,会话​​数据可能在 25 分钟之前就消失了。

        这篇文章讲述了 PHP 会话如何工作的一些细节。 http://www.experts-exchange.com/Web_Development/Web_Languages-Standards/PHP/A_11909-PHP-Sessions-Simpler-Than-You-May-Think.html

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-10-13
          • 1970-01-01
          • 1970-01-01
          • 2021-10-05
          • 1970-01-01
          相关资源
          最近更新 更多