關於laravel中session的過期時間詳解
以下由Laravel教學專欄為大家介紹laravel中session的過期時間,希望對需要的朋友有幫助!
在專案開發的過程中,前後端分離需要用session保存使用者的登陸資訊
這就涉及到session的有效期了
session又分為php中的session有效期和laravel中的session的有效期
他們預設的有效期是
在php.ini中查看session.gc_maxlifetime
預設是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调试的时候千万要注意啊。
以上是關於laravel中session的過期時間詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

Laravel郵件發送失敗時的退信代碼獲取方法在使用Laravel開發應用時,經常會遇到需要發送驗證碼的情況。而在實�...

在dcatadmin(laravel-admin)中如何實現自定義點擊添加數據的表格功能在使用dcat...

Laravel框架中Redis連接的共享與select方法的影響在使用Laravel框架和Redis時,開發者可能會遇到一個問題:通過配置...

在Laravel多租戶擴展包stancl/tenancy中自定義租戶數據庫連接使用Laravel多租戶擴展包stancl/tenancy構建多租戶應用時,...

LaravelEloquent模型檢索:輕鬆獲取數據庫數據EloquentORM提供了簡潔易懂的方式來操作數據庫。本文將詳細介紹各種Eloquent模型檢索技巧,助您高效地從數據庫中獲取數據。 1.獲取所有記錄使用all()方法可以獲取數據庫表中的所有記錄:useApp\Models\Post;$posts=Post::all();這將返回一個集合(Collection)。您可以使用foreach循環或其他集合方法訪問數據:foreach($postsas$post){echo$post->

在Laravel6項目中如何檢查Redis連接的有效性是一個常見的問題,特別是在項目依賴於Redis進行業務處理時。以下是...

Laravel數據庫遷移過程中出現類重複定義問題在使用Laravel框架進行數據庫遷移時,開發者可能會遇到“類已使用�...

Laravel 是一款 PHP 框架,用於輕鬆構建 Web 應用程序。它提供一系列強大的功能,包括:安裝: 使用 Composer 全局安裝 Laravel CLI,並在項目目錄中創建應用程序。路由: 在 routes/web.php 中定義 URL 和處理函數之間的關係。視圖: 在 resources/views 中創建視圖以呈現應用程序的界面。數據庫集成: 提供與 MySQL 等數據庫的開箱即用集成,並使用遷移來創建和修改表。模型和控制器: 模型表示數據庫實體,控制器處理 HTTP 請求。
