如何在 Laravel 中设置会话超时?

Posted

技术标签:

【中文标题】如何在 Laravel 中设置会话超时?【英文标题】:How to set session timeout in Laravel? 【发布时间】:2014-11-22 04:25:18 【问题描述】:

是否有一种固有的方法来设置会话在特定时间后过期。我当前的设置似乎在 30 分钟后到期,我想禁用它或至少增加它,但我在 Laravel 中找不到任何可以设置它的地方?

【问题讨论】:

【参考方案1】:

app/config/session.php 你有:

lifetime

允许您设置会话过期时间以分钟为单位的选项(而不是以秒为单位)

'lifetime' => 60,

表示会话将在一个小时后到期。

这里还有一个设置:

'expire_on_close' => true,

决定浏览器关闭时会话是否过期。

您可能感兴趣的其他设置还有 php.ini 的值:

session.cookie_lifetime = 0

session.gc_maxlifetime = 1440

这些是默认值。

第一个表示会话 cookie 将被存储多长时间 - 默认值为 0(直到浏览器关闭)。第二个选项表示 PHP 在多少 之后可能会销毁此会话数据。

我说可能是因为php.ini 文件中还有另一个选项session.gc_probability 决定了运行垃圾收集器的机会。默认情况下,只有 1% 的机会在 1440 秒(24 分钟)后销毁此会话数据。

【讨论】:

这个第一部分(lifetime和expire_on_close)是正确的;其余的不是。 如何在 Laravel 6 中添加 60 秒会话超时?【参考方案2】:

检查您的 php.ini,它有一个 session.gc_maxlifetime 的值(以及 session.cookie_lifetime),它设置了 PHP 允许会话多长时间的限制最后的。当 Laravel 设置选项时,它会将 cookie_lifetime 作为在 app/config/session.php 中设置的值传递。

但是,会话不会在达到最大生命周期后立即过期。发生的情况是在经过该时间后,会话就可以被垃圾收集器删除。

解决问题

一种解决方法是检查您的php.ini 文件。您可能定义了这个变量:session.gc_maxlifetime。默认情况下它设置为 1440。只需评论或删除它

从此时起,您的会话可能会使用您的 session.php 配置值正常工作。

【讨论】:

【参考方案3】:

从 Laravel 4.1 开始删除原生 PHP 会话支持

要配置会话生命周期编辑app/config/session.php 并设置以下内容:

/* if this is set to 'native' it will use file.
   if this is set to 'array' sessions will not persist across requests
   effectively expiring them immediately.
*/ 
'driver' => 'file'

/* number of minutes after which the session is available for Laravel's
   built in garbage collection.
   Prior to 4.1 you could set this to zero to expire sessions when
   the browser closes. See the next option below.
*/
'lifetime' => 60

/* If true sessions will expire when the user closes the browser.
   This effectively ignores your lifetime setting above.
   Set to false if you want Laravel to respect the lifetime value.
   If your config file was written before 4.1 you need to add this.
*/
'expire_on_close' => false,

参考资料:

Discussion of why native PHP sessions were dropped。 (因为它会自动将 cookie 信息添加到标头中,如果框架想要完全包装请求/响应,则需要大量工作才能解决) Other Laravel session drivers Addition of expire_on_close config option 在 Laravel 4.0 到 4.1 升级指南中讨论

在命令行运行 artisan changes 4.1.* 以查看有关 native 会话驱动程序等同于 file 的注释

$ artisan changes 4.1.* | grep -i native
-> Native session driver has been replaced by 'file'. Specifying 'native' driver will just use the new file driver.

【讨论】:

【参考方案4】:

App\Config\Session.php

检查生命周期...

你也可以设置...

Cookie::make('name', 'value', 60); // 1 hr

【讨论】:

以上是关于如何在 Laravel 中设置会话超时?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 web.config 中设置会话超时

如何在django中设置会话超时?

如何在 ASP.NET Core 的 web.config 中设置会话超时

在控制器中设置Laravel会话生存期

在 Spring MVC 中设置会话超时

在 Rails 3 中设置会话超时