關于laravel中session的過期時間詳解

下面由laravel教程欄目給大家介紹laravelSession的過期時間,希望對需要的朋友有所幫助!

關于laravel中session的過期時間詳解

在項目開發的過程中,前后端分離 需要用session保存用戶的登陸信息

這就涉及到session的有效期了

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

他們默認的有效期是

在php.ini中查看 session.gc_maxlifetime

關于laravel中session的過期時間詳解

默認是1440秒 差不多是24分

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

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

如果’expire_on_close’設置為false的話,’lifetime’有效,如果’expire_on_close’設置為true的話,’lifetime’無效

關于laravel的session的具體使用

學習源頭:https://www.chenyudong.com/archives/laravel-session-use.html

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

用Laravel開發應用,把原有的代碼copy過來,以前的代碼session使用了$_SESSION,本以為移植過來可以很好的運行的,因為沒有依賴其他的組件,結果出現了這個

undefined variable: _SESSION

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就無法直接使用,因為每次都是微信服務器來請求,無法通過請求的來源來辨別用戶。

laravel的session簡要API

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的session中flash概念

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

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

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

  • put :這個對應只要session不過期,基本上是永久保存,下次請求也是存在的。
  • flash :保存的值,本次請求可以使用,下次http請求可以使用,再下一次就不存在了。

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

這中情況的使用場景比如有:

  • 用戶請求了頁面,出現錯誤信息,重定向到一個新的頁面,需要展示之前的數據。(雖然可以通過url參數來傳遞,處理不好可能會有xss漏洞)。
  • 用戶訪問了一個頁面,過濾器發現沒權限,保存當前頁面url,重定向到登錄頁面,登錄成功,取出值,重定向到原先的頁面。(這里可能需要刷新保存的快閃數據)

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調試的時候千萬要注意啊。

?

以上就是關于

? 版權聲明
THE END
喜歡就支持一下吧
點贊7 分享