网站建设的公司这个,百度推广好做吗,河北邯郸做wap网站,开发板有哪些这两天遇到了一个很奇怪的问题#xff0c;更新session #xff0c;session的值不变。经过一番追查#xff0c;终于找到问题#xff0c;并搞明白了原理。写这篇博客记录下。 框架版本 Laravel 5.4 问题 先来描述下问题#xff0c;我在我们项目基础的Middleware中#xff0…这两天遇到了一个很奇怪的问题更新session session的值不变。经过一番追查终于找到问题并搞明白了原理。写这篇博客记录下。 框架版本 Laravel 5.4 问题 先来描述下问题我在我们项目基础的Middleware中加入session操作存入了一个值再在Controller中取出使用大致代码如下 // Middleware
public function handle($request, Closure $next)
{$id Redis::get(id);session([id $id]);return $next($request);
}// Controller
public function index()
{$id session(id);return [id $id];
} 假设reids中的id是1这一次访问index这个action返回的是1当你将redis中id的值改成2时在访问发现返回的还是1而且之后的访问也都是1。这里说明一下session使用的是redis 。 解决问题 看到这样神奇的结果百思不得其解。于是打开Xdebug开始调试。经过多次调试发现在执行完\Illuminate\Session\Middleware\StartSession这个Middleware后session里面的值就变回1了在之前都是2。然后想到会不会我们的Middleware在StartSession之前执行造成的将我们的Middleware移到StartSession之后发现果然可以了app/Http/Kernel.php中的代码如下 protected $middlewareGroups [web [\Illuminate\Cookie\Middleware\EncryptCookies::class,\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,\Illuminate\Session\Middleware\StartSession::class,\Illuminate\View\Middleware\ShareErrorsFromSession::class,\Illuminate\Routing\Middleware\SubstituteBindings::class,\App\Http\Middleware\OurMiddleware::class,]
]; 其中的OurMiddleware是我们自己写的Middleware之前是放在最上面的$next($request)之前的代码的执行顺序是从上到下的如果OurMiddleware中有些内容是必须在最开始的可以考虑分成两个Middleware。 理解原理 虽然解决了问题但还是不知道其原理究竟是怎样的带着这样的疑问我继续查看源码最终找到了相应的内容。 session不是实时落地的也就是说当你调用session([id $id])时id并没有被真正存入redis中而是缓存在 \Illuminate\Session\Store单例的attributes属性中可以查看其put方法代码如下 php public function put($key, $value null) { if (! is_array($key)) { $key [$key $value]; } foreach ($key as $arrayKey $arrayValue) {Arr::set($this-attributes, $arrayKey, $arrayValue);} } \Illuminate\Session\Middleware\StartSession在执行时回自动加载redis中已经实例化的数据并覆盖\Illuminate\Session\Store单例中的attributes属性所以这就导致我们一直取到的都是redis中的session数据。加载覆盖的代码如下 protected function loadSession()
{$this-attributes array_merge($this-attributes, $this-readFromHandler());
}
protected function readFromHandler()
{if ($data $this-handler-read($this-getId())) {$data unserialize($this-prepareForUnserialize($data));if ($data ! false ! is_null($data) is_array($data)) {return $data;}}return [];
}其中的readFromHandler方法就是获取redis中的session数据。 后记 其实这不是Laravel session的坑是我自己踩坑原谅我是个标题党 转载于:https://www.cnblogs.com/CraryPrimitiveMan/p/6654674.html