laravel session的使用

用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

laravel的session簡要API

Session的API仍是比較簡單的,你們看看中文文檔也大概知道是怎麼個意思。可是有那麼幾個還不太好理解。後端

  1. //session的永久保存(在不過時範圍內)  服務器

  2. Session::put('key', 'value');  微信

  3.  

  4. //等同於PHP的原生session  cookie

  5. $_SESSION['key'] = 'value';  網絡

  6.  

  7. //get操做  

  8. $value = Session::get('key', 'default');  

  9.  

  10. //去除操做並刪除,相似pop概念  

  11. $value = Session::pull('key', 'default');  

  12.  

  13. //檢測是否存在key  

  14. Session::has('users');  

  15.  

  16. //刪除key  

  17. Session::forget('key');  

這個對應只要session不過時,基本上是永久保存,下次http請求也是存在的。不一樣於下面的flash概念。

laravel的session中flash概念

可是Laravel出了個快閃flash的概念,把我一會兒給搞混了。這個flash兩次請求有效(本次和下次請求有效),與本次請求取操做多少次無關。

  1. //保存key,value  

  2. Session::flash('key', 'value');  

  3.  

  4. //取值方法仍是同樣的  

  5. Session::get('key');  

  6.  

  7. //刷新快閃數據時間,保持到下次請求  

  8. Session::keep(array('username', 'email'));  

這個flash的概念和上面的put的概念不太同樣。

  • put :這個對應只要session不過時,基本上是永久保存,下次請求也是存在的。

  • flash :保存的值,本次請求可使用,下次http請求可使用,再下一次就不存在了。

也就是說下一次的請求用完就被銷燬了,不會讓session的值變的愈來愈大,能夠保存一些臨時的數據。

這中狀況的使用場景好比有:

  • 用戶請求了頁面,出現錯誤信息,重定向到一個新的頁面,須要展現以前的數據。(雖然能夠經過url參數來傳遞,處理很差可能會有xss漏洞)。

  • 用戶訪問了一個頁面,過濾器發現沒權限,保存當前頁面url,重定向到登陸頁面,登陸成功,取出值,重定向到原先的頁面。(這裏可能須要刷新保存的快閃數據)

session落地的時間

我天真的覺得使用了Session::put函數就能保存這個變量了。因而個人代碼這樣寫:

  1. class LoginController {  

  2.  

  3.     public function login(){  

  4.         Session::put('key','value');   

  5.         print_r( Session::all() ); //取出來看看是否put成功  

  6.         exit;   //習慣性的調試都exit,不執行後續代碼  

  7.         //return Redirect::to(/); 框架在return後還會有後續的代碼執行的  

  8.     }  

  9. }  

結果下次請求就是找不到本次的Session,並且看app/storage/session目錄就是沒有文件生成。總感受不對勁啊。

後來看到網絡上有個方法Session::save(),因而我也用了下,竟然發現成功的生成了session的文件。因而我感受到,Laravel不用php原生的session,那麼在controller以後應該作了一些事情,將session寫入到文件中,而不是每次put操做都寫操做,這樣會IO操做太頻繁的,影響性能的。

查看調用相關的代碼。laravel編譯後,在bootstrap/compiled.php

  1. class Middleware implements HttpKernelInterface  

  2. {  

  3.     ...  

  4.     public function handle(Request $request$type = HttpKernelInterface::MASTER_REQUEST, $catch = true)  

  5.     {  

  6.         $this->checkRequestForArraySessions($request);  

  7.         if ($this->sessionConfigured()) {  

  8.             $session = $this->startSession($request); // 啓動session  

  9.             $request->setSession($session);  

  10.         }  

  11.         $response = $this->app->handle($request$type$catch); // 調用controller的method  

  12.         if ($this->sessionConfigured()) {  

  13.             $this->closeSession($session);         //關閉session  

  14.             $this->addCookieToResponse($response$session);  

  15.         }  

  16.         return $response;  

  17.     }  

  18.     ...  

  19.  

  20.     protected function closeSession(SessionInterface $session)  

  21.     {  

  22.         $session->save();    // 保存session  

  23.         $this->collectGarbage($session);  

  24.     }  

  25. }  

小提示:若是不知道函數調用狀況,能夠在controller中throw new Exception();,而後在/config/app.php的debug更改成debug=>true。能夠看到函數的調用關係。

能夠看見,在調用完controller以後,調用了session->save()的方法,來主動的保存session。這樣session才能落地保存起來,若是在controller或者view裏面寫了exit;,那麼session是不會被保存的,除非主動的寫Session::save()才能手工的保存起來。所以在debug調試的時候千萬要注意啊。

相關文章
相關標籤/搜索