laravel中session的过期时间
在项目开发的过程中,前后端分离 需要用session保存用户的登陆信息
这就涉及到session的有效期了
session又分为php中的session有效期和laravel中的session的有效期
他们默认的有效期是
在php.ini中查看 session.gc_maxlifetime
默认是1440秒 差不多是24分
而laravel的session有效期是在 config/session.php中
'lifetime' => 120,
'expire_on_close' => false,
如果'expire_on_close'设置为false的话,'lifetime'有效,如果'expire_on_close'设置为true的话,'lifetime'无效
关于laravel的session的具体使用
学习源头:https://www.chenyudong.com/archives/laravel-session-use.html
官方文档地址:http://laravelacademy.org/post/7954.html
用Laravel开发应用,把原有的代码copy过来,以前的代码session使用了$_SESSION
,本以为移植过来可以很好的运行的,因为没有依赖其他的组件,结果出现了这个
Undefined variable: _SESSION
Laravel的session的配置文件配置在 app/config/session.php
中,使用时可以看看 session 配置文件中可用的选项设定及注释。
Laravel 默认使用 file
的方式来实现 session的。她并不用php原生的$_SESSION(php原生的session要看php.ini的位置),所以忽略php相关的session函数,例如session_start()
, $_SESSION
。Laravel在运行过程中会在app/storage/session/
目录写入session的信息,所以这个目录需要有写权限,否者session就无法写入成功。
Laravel除了使用默认的file作为session的实现,还支持cookie
, Memcached
, Redis
和数据库
的后端驱动作为session的实现。必要的时候还需要自己实现一个session的实现方式,比如在微信公众账号和用户的交互,这中session就无法直接使用,因为每次都是微信服务器来请求,无法通过请求的来源来辨别用户。
laravel的session简要API
Session的API还是比较简单的,大家看看中文文档也大概知道是怎么个意思。但是有那么几个还不太好理解。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | //session的永久保存(在不过期范围内) Session::put( 'key' , 'value' ); //等同于PHP的原生session $_SESSION [ 'key' ] = 'value' ; //get操作 $value = Session::get( 'key' , 'default' ); //去除操作并删除,类似pop概念 $value = Session::pull( 'key' , 'default' ); //检测是否存在key Session::has( 'users' ); //删除key Session::forget( 'key' ); |
这个对应只要session不过期,基本上是永久保存,下次http请求也是存在的。不同于下面的flash概念。
laravel的session中flash概念
但是Laravel出了个快闪flash
的概念,把我一下子给搞混了。这个flash两次请求有效(本次和下次请求有效),与本次请求取操作多少次无关。
1 2 3 4 5 6 7 8 | //保存key,value Session::flash( 'key' , 'value' ); //取值方法还是一样的 Session::get( 'key' ); //刷新快闪数据时间,保持到下次请求 Session::keep( array ( 'username' , 'email' )); |
这个flash
的概念和上面的put
的概念不太一样。
- put :这个对应只要session不过期,基本上是永久保存,下次请求也是存在的。
- flash :保存的值,本次请求可以使用,下次http请求可以使用,再下一次就不存在了。
也就是说下一次的请求用完就被销毁了,不会让session的值变的越来越大,可以保存一些临时的数据。
这中情况的使用场景比如有:
- 用户请求了页面,出现错误信息,重定向到一个新的页面,需要展示之前的数据。(虽然可以通过url参数来传递,处理不好可能会有xss漏洞)。
- 用户访问了一个页面,过滤器发现没权限,保存当前页面url,重定向到登录页面,登录成功,取出值,重定向到原先的页面。(这里可能需要刷新保存的快闪数据)
session落地的时间
我天真的以为使用了Session::put
函数就能保存这个变量了。于是我的代码这样写:
1 2 3 4 5 6 7 8 9 | class LoginController { public function login(){ Session::put( 'key' , 'value' ); print_r( Session::all() ); //取出来看看是否put成功 exit ; //习惯性的调试都exit,不执行后续代码 //return Redirect::to(/); 框架在return后还会有后续的代码执行的 } } |
结果下次请求就是找不到本次的Session,而且看app/storage/session
目录就是没有文件生成。总感觉不对劲啊。
后来看到网络上有个方法Session::save()
,于是我也用了下,居然发现成功的生成了session的文件。于是我感觉到,Laravel不用php原生的session,那么在controller之后应该做了一些事情,将session写入到文件中,而不是每次put
操作都写操作,这样会IO操作太频繁的,影响性能的。
查看调用相关的代码。laravel编译后,在bootstrap/compiled.php
中
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | class Middleware implements HttpKernelInterface { ... public function handle(Request $request , $type = HttpKernelInterface::MASTER_REQUEST, $catch = true) { $this ->checkRequestForArraySessions( $request ); if ( $this ->sessionConfigured()) { $session = $this ->startSession( $request ); // 启动session $request ->setSession( $session ); } $response = $this ->app->handle( $request , $type , $catch ); // 调用controller的method if ( $this ->sessionConfigured()) { $this ->closeSession( $session ); //关闭session $this ->addCookieToResponse( $response , $session ); } return $response ; } ... protected function closeSession(SessionInterface $session ) { $session ->save(); // 保存session $this ->collectGarbage( $session ); } } |
小提示:如果不知道函数调用情况,可以在controller中throw new Exception();
,然后在/config/app.php
的debug更改为debug=>true
。可以看到函数的调用关系。
可以看见,在调用完controller之后,调用了session->save()
的方法,来主动的保存session。这样session才能落地保存起来,如果在controller或者view里面写了exit;
,那么session是不会被保存的,除非主动的写Session::save()
才能手工的保存起来。因此在debug调试的时候千万要注意啊。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
· .NET 进程 stackoverflow异常后,还可以接收 TCP 连接请求吗?
· SQL Server统计信息更新会被阻塞或引起会话阻塞吗?
· 传国玉玺易主,ai.com竟然跳转到国产AI
· 本地部署 DeepSeek:小白也能轻松搞定!
· 自己如何在本地电脑从零搭建DeepSeek!手把手教学,快来看看! (建议收藏)
· 我们是如何解决abp身上的几个痛点
· 普通人也能轻松掌握的20个DeepSeek高频提示词(2025版)