• 技术文章 >php框架 >Laravel

    关于laravel中session的过期时间详解

    藏色散人藏色散人2020-07-11 16:12:18转载2514
    下面由Laravel教程栏目给大家介绍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还是比较简单的,大家看看中文文档也大概知道是怎么个意思。但是有那么几个还不太好理解。

    //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的概念不太一样。

    也就是说下一次的请求用完就被销毁了,不会让session的值变的越来越大,可以保存一些临时的数据。

    这中情况的使用场景比如有:

    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的过期时间详解的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:cnblogs,如有侵犯,请联系admin@php.cn删除
    专题推荐:laravel session
    上一篇:Laravel 中如何对 ORM 实现理解 下一篇:如何使用Laravel图片处理包intervention-image
    大前端线上培训班

    相关文章推荐

    • Laravel 特点有哪些?• laravel从mysql数据库中随机抽取n条数据(高性能)• laravel如何通过中间件验证路由登陆访问• Laravel 中如何对 ORM 实现理解

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网