发布网友 发布时间:2022-04-06 06:38
共3个回答
懂视网 时间:2022-04-06 10:59
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就无法直接使用,因为每次都是微信服务器来请求,无法通过请求的来源来辨别用户。
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出了个快闪flash
的概念,把我一下子给搞混了。这个flash两次请求有效(本次和下次请求有效),与本次请求取操作多少次无关。
//保存key,value Session::flash('key', 'value'); //取值方法还是一样的 Session::get('key'); //刷新快闪数据时间,保持到下次请求 Session::keep(array('username', 'email'));
这个flash
的概念和上面的put
的概念不太一样。
也就是说下一次的请求用完就被销毁了,不会让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调试的时候千万要注意啊。
热心网友 时间:2022-04-06 08:07
PHP 代码为:
//Session_Start 30 minutes destroy
$lifeTime = 1800;//单位:秒
try
{
session_start();
setcookie( session_name(), session_id(), time() + $lifeTime, "/" );
}
catch ( Exception $e )
{
session_set_cookie_params( $lifeTime );
session_start();
}
$_SESSION["LOGIN"] = "OK";
相关说明:
Session 是如何来判断客户端用户的呢?它是通过 Session ID 来判断的,什么是 Session ID,就是那个 Session 文件的文件名,Session ID 是随机生成的,因此能保证唯一性和随机性,确保 Session 的安全。一般如果没有设置 Session 的生存周期,则 Session ID 存储在内存中,关闭浏览器后该 ID 自动注销,重新请求该页面后,重新注册一个 Session ID。
如果客户端没有禁用 Cookie,则 Cookie 在启动 Session 会话的时候扮演的是存储 Session ID 和 Session 生存期的角色。Session 还提供了一个函数 session_set_cookie_params(); 来设置 Session 的生存期的,该函数必须在 session_start() 函数调用之前调用:如上面的代码所示。
热心网友 时间:2022-04-06 09:25
session过期时间是从最后一次会话结束开始算的,如果你在过期时间内重新连接过,那么过期时间会重置