php laravel session,Laravel框架中Session储存机制

0x01 起因一次操作在Controller中删除了Session,然后立马来了一个dd(session(key));很惊讶的发现,Session是空的,但是因为中间键那里是进行了登陆判断的。虽然dd出来的Session是空的,然而访问其它页面居然毫无影响。我第一时间是以为中间键没弄好。经过仔细检查后,发现。。。。

0x02 经过

部分Session操作//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,但是Session好像并没有立即生效。

谷歌后,发现有个方法Session::save(),在销毁了Session后执行下这个,再dd,立马生效了。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值