欧美亚洲中文,在线国自产视频,欧洲一区在线观看视频,亚洲综合中文字幕在线观看

      1. <dfn id="rfwes"></dfn>
          <object id="rfwes"></object>
        1. 站長(zhǎng)資訊網(wǎng)
          最全最豐富的資訊網(wǎng)站

          關(guān)于laravel中session的過(guò)期時(shí)間詳解

          下面由Laravel教程欄目給大家介紹laravel中session的過(guò)期時(shí)間,希望對(duì)需要的朋友有所幫助!

          關(guān)于laravel中session的過(guò)期時(shí)間詳解

          在項(xiàng)目開(kāi)發(fā)的過(guò)程中,前后端分離 需要用session保存用戶的登陸信息

          這就涉及到session的有效期了

          session又分為php中的session有效期和laravel中的session的有效期

          他們默認(rèn)的有效期是

          在php.ini中查看 session.gc_maxlifetime

          關(guān)于laravel中session的過(guò)期時(shí)間詳解

          默認(rèn)是1440秒 差不多是24分

          而laravel的session有效期是在 config/session.php中

          'lifetime' => 120,  'expire_on_close' => false,

          如果'expire_on_close'設(shè)置為false的話,'lifetime'有效,如果'expire_on_close'設(shè)置為true的話,'lifetime'無(wú)效

          關(guān)于laravel的session的具體使用

          學(xué)習(xí)源頭:https://www.chenyudong.com/archives/laravel-session-use.html

          官方文檔地址:http://laravelacademy.org/post/7954.html

          用Laravel開(kāi)發(fā)應(yīng)用,把原有的代碼copy過(guò)來(lái),以前的代碼session使用了$_SESSION,本以為移植過(guò)來(lái)可以很好的運(yùn)行的,因?yàn)闆](méi)有依賴其他的組件,結(jié)果出現(xiàn)了這個(gè)

          Undefined variable: _SESSION

          Laravel的session的配置文件配置在 app/config/session.php 中,使用時(shí)可以看看 session 配置文件中可用的選項(xiàng)設(shè)定及注釋。

          Laravel 默認(rèn)使用 file 的方式來(lái)實(shí)現(xiàn) session的。她并不用php原生的$_SESSION(php原生的session要看php.ini的位置),所以忽略php相關(guān)的session函數(shù),例如session_start(), $_SESSION。Laravel在運(yùn)行過(guò)程中會(huì)在app/storage/session/目錄寫入session的信息,所以這個(gè)目錄需要有寫權(quán)限,否者session就無(wú)法寫入成功。

          Laravel除了使用默認(rèn)的file作為session的實(shí)現(xiàn),還支持cookie, Memcached, Redis數(shù)據(jù)庫(kù)的后端驅(qū)動(dòng)作為session的實(shí)現(xiàn)。必要的時(shí)候還需要自己實(shí)現(xiàn)一個(gè)session的實(shí)現(xiàn)方式,比如在微信公眾賬號(hào)和用戶的交互,這中session就無(wú)法直接使用,因?yàn)槊看味际俏⑿欧?wù)器來(lái)請(qǐng)求,無(wú)法通過(guò)請(qǐng)求的來(lái)源來(lái)辨別用戶。

          laravel的session簡(jiǎn)要API

          Session的API還是比較簡(jiǎn)單的,大家看看中文文檔也大概知道是怎么個(gè)意思。但是有那么幾個(gè)還不太好理解。

          //session的永久保存(在不過(guò)期范圍內(nèi)) Session::put('key', 'value');  //等同于PHP的原生session $_SESSION['key'] = 'value';  //get操作 $value = Session::get('key', 'default');  //去除操作并刪除,類似pop概念 $value = Session::pull('key', 'default');  //檢測(cè)是否存在key Session::has('users');  //刪除key Session::forget('key');

          這個(gè)對(duì)應(yīng)只要session不過(guò)期,基本上是永久保存,下次http請(qǐng)求也是存在的。不同于下面的flash概念。

          laravel的session中flash概念

          但是Laravel出了個(gè)快閃flash的概念,把我一下子給搞混了。這個(gè)flash兩次請(qǐng)求有效(本次和下次請(qǐng)求有效),與本次請(qǐng)求取操作多少次無(wú)關(guān)。

          //保存key,value Session::flash('key', 'value');  //取值方法還是一樣的 Session::get('key');  //刷新快閃數(shù)據(jù)時(shí)間,保持到下次請(qǐng)求 Session::keep(array('username', 'email'));

          這個(gè)flash的概念和上面的put的概念不太一樣。

          • put :這個(gè)對(duì)應(yīng)只要session不過(guò)期,基本上是永久保存,下次請(qǐng)求也是存在的。
          • flash :保存的值,本次請(qǐng)求可以使用,下次http請(qǐng)求可以使用,再下一次就不存在了。

          也就是說(shuō)下一次的請(qǐng)求用完就被銷毀了,不會(huì)讓session的值變的越來(lái)越大,可以保存一些臨時(shí)的數(shù)據(jù)。

          這中情況的使用場(chǎng)景比如有:

          • 用戶請(qǐng)求了頁(yè)面,出現(xiàn)錯(cuò)誤信息,重定向到一個(gè)新的頁(yè)面,需要展示之前的數(shù)據(jù)。(雖然可以通過(guò)url參數(shù)來(lái)傳遞,處理不好可能會(huì)有xss漏洞)。
          • 用戶訪問(wèn)了一個(gè)頁(yè)面,過(guò)濾器發(fā)現(xiàn)沒(méi)權(quán)限,保存當(dāng)前頁(yè)面url,重定向到登錄頁(yè)面,登錄成功,取出值,重定向到原先的頁(yè)面。(這里可能需要刷新保存的快閃數(shù)據(jù))

          session落地的時(shí)間

          我天真的以為使用了Session::put函數(shù)就能保存這個(gè)變量了。于是我的代碼這樣寫:

          class LoginController {      public function login(){         Session::put('key','value');          print_r( Session::all() ); //取出來(lái)看看是否put成功         exit;   //習(xí)慣性的調(diào)試都exit,不執(zhí)行后續(xù)代碼         //return Redirect::to(/); 框架在return后還會(huì)有后續(xù)的代碼執(zhí)行的     } }

          結(jié)果下次請(qǐng)求就是找不到本次的Session,而且看app/storage/session目錄就是沒(méi)有文件生成。總感覺(jué)不對(duì)勁啊。

          后來(lái)看到網(wǎng)絡(luò)上有個(gè)方法Session::save(),于是我也用了下,居然發(fā)現(xiàn)成功的生成了session的文件。于是我感覺(jué)到,Laravel不用php原生的session,那么在controller之后應(yīng)該做了一些事情,將session寫入到文件中,而不是每次put操作都寫操作,這樣會(huì)IO操作太頻繁的,影響性能的。

          查看調(diào)用相關(guān)的代碼。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); // 啟動(dòng)session             $request->setSession($session);         }         $response = $this->app->handle($request, $type, $catch); // 調(diào)用controller的method         if ($this->sessionConfigured()) {             $this->closeSession($session);         //關(guān)閉session             $this->addCookieToResponse($response, $session);         }         return $response;     }     ...      protected function closeSession(SessionInterface $session)     {         $session->save();    // 保存session         $this->collectGarbage($session);     } }

          小提示:如果不知道函數(shù)調(diào)用情況,可以在controller中throw new Exception();,然后在/config/app.php的debug更改為debug=>true??梢钥吹胶瘮?shù)的調(diào)用關(guān)系。

          可以看見(jiàn),在調(diào)用完controller之后,調(diào)用了session->save()的方法,來(lái)主動(dòng)的保存session。這樣session才能落地保存起來(lái),如果在controller或者view里面寫了exit;,那么session是不會(huì)被保存的,除非主動(dòng)的寫Session::save()才能手工的保存起來(lái)。因此在debug調(diào)試的時(shí)候千萬(wàn)要注意啊。

          贊(0)
          分享到: 更多 (0)
          網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)