当前位置: 首页 > 面试题库 >

如何在PHP中更改会话超时?

武睿
2023-03-14
问题内容

我想在php中延长会话超时

我知道可以通过修改php.ini文件来实现。但我无权访问。

那么有可能只用php代码来做到吗?


问题答案:

如果需要严格的保证,会话超时是必须在代码中实现的概念。这是 唯一的办法 ,你可以绝对肯定的是,没有永远的会话将不活动的X分钟后存活。

如果稍微放松一下此要求是可以接受的,并且可以设置 下限 而不是严格的持续时间,那么您可以轻松地做到这一点,而无需编写自定义逻辑。

轻松环境中的便利:如何以及为什么

如果 您的会话与饼干(他们可能是)来实现,并且如果客户端是没有恶意的,你可以设定一个上限通过调整某些参数绑定在会话持续时间。如果您将PHP的默认会话处理与Cookie配合使用,则设置session.gc_maxlifetimesession_set_cookie_params应该适合您,如下所示:

// server should keep session data for AT LEAST 1 hour
ini_set('session.gc_maxlifetime', 3600);

// each client should remember their session id for EXACTLY 1 hour
session_set_cookie_params(3600);

session_start(); // ready to go!

通过将服务器配置为使会话数据保持至少一小时的不活动状态,并指示您的客户端在相同的时间间隔后“忘记”其会话ID,可以进行此操作。
这两个步骤都是实现预期结果所必需的。

  • 如果您不告诉客户一个小时后忘记他们的会话ID(或者如果客户是恶意的并且选择忽略您的指令),他们将继续使用相同的会话ID,其有效期限将是不确定的。这是因为生存期已在服务器端终止的会话不会立即进行垃圾收集,而只会在会话GC启动时进行垃圾收集。

GC是一个潜在的昂贵过程,因此通常概率很小或什至为零(获得大量点击的网站可能会完全放弃概率性GC,并将其安排在每隔X分钟出现在后台)。在这两种情况下(假定不合作的客户端),有效会话生存期的下限将是session.gc_maxlifetime,但是上限将是不可预测的。

  • 如果您没有设置session.gc_maxlifetime相同的时间跨度,则服务器可能会在此之前更早地丢弃空闲会话数据;在这种情况下,仍然记住其会话ID的客户端将显示该ID,但服务器将找不到与该会话相关的数据,从而有效地表现出该会话刚刚开始。

在关键环境中的确定性

您可以通过使用自定义逻辑还放置使事情完全可控 的上限 会话活动; 再加上上方的下限,将导致严格的设置。

通过将上限与其他会话数据一起保存,可以做到这一点:

session_start(); // ready to go!

$now = time();
if (isset($_SESSION['discard_after']) && $now > $_SESSION['discard_after']) {
    // this session has worn out its welcome; kill it and start a brand new one
    session_unset();
    session_destroy();
    session_start();
}

// either new or old, it should live at most for another hour
$_SESSION['discard_after'] = $now + 3600;

会话ID持久化

到目前为止,我们根本不关心每个会话ID的确切值,只关心只要我们需要它们就应该存在数据。请注意,在(不太可能)会话ID对您很重要的情况下,必须注意session_regenerate_id在需要时使用它们重新生成它们。



 类似资料:
  • 问题内容: 我在用户登录时创建会话,如下所示: 如何在X分钟的会话上指定超时,然后在达到X分钟后让它执行功能或页面重定向? 编辑:我忘了提及由于不活动,我需要会话超时。 问题答案: 首先,存储用户最后一次发出请求的时间 在后续请求中,检查他们多久之前提出了请求(在此示例中为10分钟)

  • https://www.playframework.com/documentation/2.6.x/javaactionscomposition#action-composition 注意:我在会话obejct中没有找到任何方法,就像我们在java(J2EE)session.SetMaxInActiveInterval(15*60)中得到的那样;请引导我。事先谢谢..

  • 问题内容: 默认情况下,PHP会话是否超时-即,如果我没有任何编码,最终在一段时间不活动后最终将“注销”用户吗? 问题答案: 这取决于服务器配置或相关指令的session.gc_maxlifetime在。 通常情况下,默认值为24分钟(1440秒),但是您的虚拟主机可能已将默认值更改为其他值。

  • 我找到了很多关于这个问题的答案,但没有解决我的问题-所以我想给你看我的代码,希望有人能找到错误... 我有一个标准的超文本标记语言的形式,给一些数据与POST到下一个. php文件,我得到它,并将其保存到会话变量。我使用会话变量有两个原因: 如果有人重新加载页面,它应该显示与以前相同的信息 我需要在即将到来的php文件中的变量 代码如下: 第一个调用工作精细会话变量被设置,回声给出正确的值。重新加

  • 我有一个无状态EJB,并通过注释@webservice为它定义了一个web服务endpoint(如下所示)。我使用HTTP会话和WebServiceContext管理身份验证和会话。代码工作正常。 我需要做的是更改EJB webserviceendpoint的http会话的超时。我尝试了所有的方法,但是由于该程序在glassfish上部署为ejb-jar,所以没有web.xml。如何更改EJB w

  • 问题内容: 和之间的实际区别是什么? 假设我希望用户会话在闲置15分钟后无效(而不是在第一次打开后15分钟内无效)。其中哪一项对我有帮助? 我也知道我可以这样做,可以将用户的Cookie设置为在一定时间内过期。但是,cookie过期与服务器端的实际会话过期是不相同的。Cookie过期后,这还会删除会话吗? 我的另一个解决方案是 对每个请求都很简单 ,然后将会话与当前时间进行比较,然后基于该时间删除