laravel中session的过期时间

摘要:
默认情况下,Laravel使用file方法实现会话。在运行过程中,Larave将在app/storage/session/目录中写入会话信息,因此此目录需要写入权限,否则无法成功写入会话。除了使用默认文件作为会话实现,Larravel还支持cookie、Memcached、Redis和数据库后端驱动程序作为会话实现。拉拉威尔课程中的闪光概念被拉拉威尔的闪光概念所混淆。所以我觉得Larave不使用PHP的本机会话,所以在控制器之后,它应该做一些事情将会话写入文件,而不是每次执行put操作时都写入。这将导致过多的IO操作并影响性能。

在项目开发的过程中,前后端分离 需要用session保存用户的登陆信息

这就涉及到session的有效期了

session又分为php中的session有效期和laravel中的session的有效期

他们默认的有效期是

在php.ini中查看 session.gc_maxlifetime

laravel中session的过期时间第1张

默认是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还是比较简单的,大家看看中文文档也大概知道是怎么个意思。但是有那么几个还不太好理解。

//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两次请求有效(本次和下次请求有效),与本次请求取操作多少次无关。

//保存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函数就能保存这个变量了。于是我的代码这样写:

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

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调试的时候千万要注意啊。

免责声明:文章转载自《laravel中session的过期时间》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇HTML中几个常见的问题bootstrap正则表达式验证手机 座机 邮箱下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

使用SQLAlchemy操作已存在的数据库的表

需求场景: 使用sqlalchmy从现有的表中获取数据(不是自己建表)。百度了一下,网上都是使用sqlalchemy自己先创建表,然后导入数据表的模型类进行增删改查;现在不是自己建表,该如何操作呢? 操作方案 通过sqlalchmey执行原生的sql语句,增删改查的原生语句携带表名,就不需要导入数据表的模型类了。 使用的包: SQLAlchemy (1.3...

Linux使用PAM锁定多次登陆失败的用户(重置次数)原理后续补充----

  linux上的用户,如果用户连续3次登录失败,就锁定该用户,几分钟后该用户再自动解锁。Linux有一个pam_tally2.so的PAM模块,来限定用户的登录失败次数,如果次数达到设置的阈值,则锁定用户。 1、 vim /etc/pam.d/sshd    (远程ssh)   限制用户远程登录   在#%PAM-1.0的下面,即第二行,添加内容,一定...

springsession生成sessionid不一致问题解决

不废话,本人遇到的问题主要是两个不同的springboot版本,需要共享sessionid。 1.配置application #cookie作用域server.servlet.session.cookie.path=/server.servlet.session.cookie.max-age=-1server.servlet.session.cookie....

Golang 对MongoDB的操作简单封装

使用MongoDB的Go驱动库mgo,对MongoDB的操作做一下简单封装 初始化 操作没有用户权限的MongoDB var globalS *mgo.Session func init() { s, err := mgo.Dial(dialInfo) if err != nil { log.Fatalf("Create...

Flask-爱家租房项目ihome-01-项目框架的搭建

项目介绍 该项目是一个简易版的租房平台项目, 房东可以在平台上发布自己的房源, 房客可以搜索心仪的房源并进行一定时间的租赁. 主要功能模块包括用户模块(注册/登录/个人信息), 租房首页, 房屋列表页,房屋详情页, 房屋预订页, 支付宝支付等. 该项目属于不完全的前后端分离, 前端使用的是html+css+jquery, 后端使用的是flask框架, 后端...

分布式下Session一致性问题

一、Session一致性问题 1.1 什么是Session 用户使用网站的服务,基本上需要浏览器和web服务器进行多次交互,web服务器如何知道哪些请求是来自哪个会话的? 具体方式为:在会话开始时,分配一个唯一的会话标识(sessionId),通过cookie把这个标识告诉浏览器,以后每次请求的时候,浏览器都会带上这个会话标识来告诉web服务器请求是属于哪...