用Laravel开发应用,把原有的代码copy过来,之前的代码session使用了$_SESSION
,本觉得移植过来能够很好的运行的,由于没有依赖其余的组件,结果出现了这个php
Undefined variable: _SESSIONhtml
Laravel的session的配置文件配置在 app/config/session.php
中,使用时能够看看 session 配置文件中可用的选项设定及注释。laravel
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就没法直接使用,由于每次都是微信服务器来请求,没法经过请求的来源来辨别用户。bootstrap
Session的API仍是比较简单的,你们看看中文文档也大概知道是怎么个意思。可是有那么几个还不太好理解。后端
//session的永久保存(在不过时范围内) 服务器
Session::put('key', 'value'); 微信
//等同于PHP的原生session cookie
$_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出了个快闪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::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调试的时候千万要注意啊。