我想延长php中的会话超时时间.

我知道通过修改php.ini文件可以做到这一点. 但我无法接触到它.

那么,是否可以只使用php代码?

推荐答案

会话超时是一个必须在代码中实现的概念,如果您需要严格的保证;这是the only way,你可以绝对肯定,在X分钟的不活动之后,任何一个会话都不会存活下来.

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

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

If您的会话是通过cookie实现的(它们可能是),if如果客户端不是恶意的,您可以通过调整某些参数来设置会话持续时间的上限.如果您使用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来实现的.Both of these steps are required to achieve the expected result.

  • 如果您不告诉客户端在一小时后忘记它们的会话ID(或者如果客户端是恶意的并 Select 忽略您的指令),它们将继续使用相同的会话ID,其有效持续时间将是不确定的.这是因为在服务器端生命周期已过期的会话不会立即被垃圾收集,而只会被垃圾收集whenever the session GC kicks in次.

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

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

关键环境中的确定性

通过使用自定义逻辑,还可以将upper bound置于会话不活动状态,使事情完全可控;加上上面的下限,这将导致一个严格的设置.

通过将上限与会话数据的其余部分一起保存来实现这一点:

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重新生成会话ID.

Php相关问答推荐

文件大小在php下载读取文件中不可见

此行动未经授权.升级Laravel时

SQLSTATE [42S02]:找不到基表或视图:1146 Table eshop. sessions不存在'''

如何在Woocommerce中禁用机器人添加到推车?

在没有symfony应用程序的情况下使用安全Bundle 包时,缺少配置构建器类

多行PHP属性声明中是否允许单行注释

对表示大小的值后缀进行自定义排序(XXS、XS、S、M、L、XL、XXL)

如何在PHP中根据会话将用户重定向到不同的页面?

在 php 中生成 MAC ISO/IEC 9797-1

Symfony:指定 data_class 时,提交的表单获取初始化前不得访问

通过存储库检索 Blade 上的单值数据 出错

PHP - 计算非数值数组

WooCommerce – 在新订单邮箱通知中显示产品分类计数

在 Symfony 测试中何时使用 TestCase 而不是 KernelTestCase

Laravel:ArgumentCountError: 函数 App\Mail 的参数太少

如何使用动态变量定义 bind_result?

我怎样才能在 .htaccess 中有 2 个参数?

如何在供应商名称后将自定义徽章添加到商品详情

获取具有所有特定相关模型的模型

Laravel 从嵌套数组的第二级获取最后一项