文档章节

laravel session的使用

mdoo
 mdoo
发布于 2015/10/09 23:00
字数 1256
阅读 2627
收藏 0

用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. //session的永久保存(在不过期范围内)  

  2. Session::put('key', 'value');  

  3.  

  4. //等同于PHP的原生session  

  5. $_SESSION['key'] = 'value';  

  6.  

  7. //get操作  

  8. $value = Session::get('key', 'default');  

  9.  

  10. //去除操作并删除,类似pop概念  

  11. $value = Session::pull('key', 'default');  

  12.  

  13. //检测是否存在key  

  14. Session::has('users');  

  15.  

  16. //删除key  

  17. Session::forget('key');  

这个对应只要session不过期,基本上是永久保存,下次http请求也是存在的。不同于下面的flash概念。

laravel的session中flash概念

但是Laravel出了个快闪flash的概念,把我一下子给搞混了。这个flash两次请求有效(本次和下次请求有效),与本次请求取操作多少次无关。

  1. //保存key,value  

  2. Session::flash('key', 'value');  

  3.  

  4. //取值方法还是一样的  

  5. Session::get('key');  

  6.  

  7. //刷新快闪数据时间,保持到下次请求  

  8. Session::keep(array('username', 'email'));  

这个flash的概念和上面的put的概念不太一样。

  • put :这个对应只要session不过期,基本上是永久保存,下次请求也是存在的。

  • flash :保存的值,本次请求可以使用,下次http请求可以使用,再下一次就不存在了。

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

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

  • 用户请求了页面,出现错误信息,重定向到一个新的页面,需要展示之前的数据。(虽然可以通过url参数来传递,处理不好可能会有xss漏洞)。

  • 用户访问了一个页面,过滤器发现没权限,保存当前页面url,重定向到登录页面,登录成功,取出值,重定向到原先的页面。(这里可能需要刷新保存的快闪数据)

session落地的时间

我天真的以为使用了Session::put函数就能保存这个变量了。于是我的代码这样写:

  1. class LoginController {  

  2.  

  3.     public function login(){  

  4.         Session::put('key','value');   

  5.         print_r( Session::all() ); //取出来看看是否put成功  

  6.         exit;   //习惯性的调试都exit,不执行后续代码  

  7.         //return Redirect::to(/); 框架在return后还会有后续的代码执行的  

  8.     }  

  9. }  

结果下次请求就是找不到本次的Session,而且看app/storage/session目录就是没有文件生成。总感觉不对劲啊。

后来看到网络上有个方法Session::save(),于是我也用了下,居然发现成功的生成了session的文件。于是我感觉到,Laravel不用php原生的session,那么在controller之后应该做了一些事情,将session写入到文件中,而不是每次put操作都写操作,这样会IO操作太频繁的,影响性能的。

查看调用相关的代码。laravel编译后,在bootstrap/compiled.php

  1. class Middleware implements HttpKernelInterface  

  2. {  

  3.     ...  

  4.     public function handle(Request $request$type = HttpKernelInterface::MASTER_REQUEST, $catch = true)  

  5.     {  

  6.         $this->checkRequestForArraySessions($request);  

  7.         if ($this->sessionConfigured()) {  

  8.             $session = $this->startSession($request); // 启动session  

  9.             $request->setSession($session);  

  10.         }  

  11.         $response = $this->app->handle($request$type$catch); // 调用controller的method  

  12.         if ($this->sessionConfigured()) {  

  13.             $this->closeSession($session);         //关闭session  

  14.             $this->addCookieToResponse($response$session);  

  15.         }  

  16.         return $response;  

  17.     }  

  18.     ...  

  19.  

  20.     protected function closeSession(SessionInterface $session)  

  21.     {  

  22.         $session->save();    // 保存session  

  23.         $this->collectGarbage($session);  

  24.     }  

  25. }  

小提示:如果不知道函数调用情况,可以在controller中throw new Exception();,然后在/config/app.php的debug更改为debug=>true。可以看到函数的调用关系。

可以看见,在调用完controller之后,调用了session->save()的方法,来主动的保存session。这样session才能落地保存起来,如果在controller或者view里面写了exit;,那么session是不会被保存的,除非主动的写Session::save()才能手工的保存起来。因此在debug调试的时候千万要注意啊。



© 著作权归作者所有

共有 人打赏支持
mdoo
粉丝 7
博文 64
码字总数 50967
作品 0
淄博
laravel框架session使用教程

laravel是一款php框架了,在使用laravel时会碰到session使用问题了,在使用过程中碰到一些问题与一些应用的例子。 用Laravel开发应用,把原有的代码copy过来,以前的代码session使用了$_SES...

chaoluo001
2017/07/14
0
0
Laravel5.3之Session源码解析(中)

说明:在上篇中学习了session的启动过程,主要分为两步,一是session的实例化,即IlluminateSessionStore的实例化;二是从session存储介质redis中读取的数据。Laravel5.3把session垃圾回收放...

botkenni
2016/11/19
12
0
Laravel5.3之Session源码解析(上)

说明:本文主要通过学习Laravel的session源码学习Laravel是如何设计session的,将自己的学习心得分享出来,希望对别人有所帮助。Laravel在中定义了session中间件,并通过该中间件来设计sessi...

botkenni
2016/11/18
13
0
Laravel3 学习笔记

Web开发框最大的存在意义无疑是为开发者提供便利,这种被提供的便利不仅表现在对于整个应用接口上的梳理、组织和解耦,也表现在更多细微方 便,比如各种工具的提供。Laravel3为开发者提供了各...

mdoo
2015/10/09
25
0
Laravel项目和其它项目共享session问题

我这边总结一下,也许以后有人会需要, 其实Laravel的session并不是用PHP自带的session管理器。而是完完全全自己实现了一个。 注意是完完全全自己实现的,并不是传统意义上用sessionsetsaveh...

mdoo
2015/10/02
689
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

spring 容器实现对bean的管理(注解方式解析,源码阅读)

因为最近在研究学习spring boot,所以这里想详细学习回顾了一下spring 容器对bean的一些管理方式和部分源码学习。 首先初始类AnnotationConfigApplicationContext,简单源码查看,支持两个参...

小海bug
10分钟前
0
0
数据结构:二分查找 java

二分查找的前提是有序存储,利用顺序存储和元素排序 /** * 二分查找,查找成功,返回下标记 * @param values * @param begin * @param end * @param key * @param <T> * @ret...

京一
28分钟前
0
0
@SpringBootApplication 注解

@SpringBootApplication注解是一个组合注解,包含以下注解 @Target(ElementType.TYPE) 注解的作用目标 @Retention(RetentionPolicy.RUNTIME) Reteniton的作用是定义被它所注解的注解保留多久,...

java.刘
41分钟前
0
0
sentinel自定义DataSource实战

序 本文主要研究一下如何自定义sentinel的DataSource,这里以jdbc为例。 maven <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-sen......

go4it
57分钟前
1
0
xgboost/gbdt在调参时为什么树的深度很少就能达到很高的精度?

问题: 用xgboost/gbdt在在调参的时候把树的最大深度调成6就有很高的精度了。但是用DecisionTree/RandomForest的时候需要把树的深度调到15或更高。用RandomForest所需要的树的深度和Decisio...

tantexian
58分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部