无法延长会话到期时间

时间:2015-08-24 14:32:02

标签: php session cookies safari

我目前正在建立一个网站,其中篮子数据等存储在会话变量中。问题是,使用默认设置,会话将在会话结束时到期。

我已经尝试了一系列有关如何修改会话到期日期的建议,并且在使用$params = session_get_cookie_params(); var_dump($params);时我可以看到会话到期时间已经更改为我设置的内容。

我在Safari 8.0.8上使用Web检查器的问题,会话cookie仍然表示会话结束时到期。我还尝试使用setcookie()命令手动更新cookie。

目前我在localhost上运行,但最初部署在共享的Web服务器上。

这是预期的吗? Safari的问题?有什么想法吗?

1 个答案:

答案 0 :(得分:1)

会话超时是一个必须在代码中实现的概念,如果你想要严格的保证;这是唯一的方式你可以绝对肯定在X分钟不活动后,任何会话都无法生存。

如果放宽这个要求有一点是可以接受的,你可以放置一个下限而不是对持续时间的严格限制,你可以轻松地这样做,而无需编写自定义逻辑。

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

如果您的会话是使用Cookie(他们可能是)实现的,而如果则客户端不是恶意的,您可以设置会话持续时间的上限调整某些参数。如果你使用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,其有效持续时间将是非确定性。这是因为服务器端生命周期已过期的会话不会立即被垃圾收集,而只会被whenever the session GC kicks in收集。

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

  • 如果未将session.gc_maxlifetime设置为相同的时间跨度,则服务器可能会提前丢弃空闲会话数据;在这种情况下,仍然会记住其会话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重新生成它们。