說明:在中篇中學習了session的CRUD增删改查操作,本篇主要學習關閉session的相關源碼。實際上,在Laravel5.3中關閉session主要包括兩個過程:儲存目前URL到session媒體中;在Response Header中存入cookie。其中,Laravel5.3把垃圾回收提前到了中間件的前置操作,中篇有聊到。OK,學習下關閉session的源碼吧先。
開發環境:Laravel5.3 + PHP7
關閉Session
首先看下
\Illuminate\Session\Middleware\StartSession::class
中間件源碼的handle()方法:
從源碼中可知關閉session做了兩件事:存儲目前URL;往Response Header中添加cookie。
OK,先看第一件事:
// \Illuminate\Session\Middleware\StartSession
protected function storeCurrentUrl(Request $request, $session) { // 如果是GET,并且不是ajax,且route對象不能為空 if ($request->method() === 'GET' && $request->route() && ! $request->ajax()) { $session->setPreviousUrl($request->fullUrl()); } } public function setPreviousUrl($url) { // 使用中篇聊到的put()方法更新式存儲$url, // 如sentry.app:8888/session,存入到redis中的'laravel:_previous.url' $this->put('_previous.url', $url); }
是以第一件事很簡單,OK,看下第二件事:
第二件事也很簡單,執行個體化
Symfony\Component\HttpFoundation\Cookie
,并存入到response header中。其中,執行個體化Cookie所需要的各個參數值為:
(1) $session->getName()
// $session就是\Illuminate\Session\Store對象
// 在執行個體化Store對象時,傳入的name值是讀取的app['config']['session.cookie']
// 見 \Illuminate\Session\SessionManager::buildSession() line 178
'laravel_session' = $session->getName();
(2) $session->getId()
// 在執行個體化Store時,傳入的$id=null,則在Store構造函數中使用setId()設定$id值
//看下Store::setId()源碼就知道id是随機生成的長度為40的字元串
Str::random(
(3) $this->getCookieExpirationDate()
// config/session.php中預設expire_on_close = false, lifetime = 60
// 表示如果浏覽器關閉session不過期,則保留60分鐘後再過期
protected function getCookieExpirationDate() { $config = $this->manager->getSessionConfig(); return $config['expire_on_close'] ?
(4) $config['path']
// 預設是'/',這是設定'/session',等會看下響應頭
'/session' = $config['path']
(5) $config['domain']
// 這裡在config/session.php中設定成'session_domain',等會看下響應頭
'session_domain' = $config['domain']
(6) Arr::get($config, 'secure', false)
// 就預設值false
false = Arr::get($config, 'secure', false)
(7) Arr::get($config, 'http_only', true)
// 就預設值true
true = Arr::get($config, 'http_only', true)
這裡輸入路由
sentry.app:8888/session
(在本地環境配置你的路由)簡單輸出個字元串'session',主要看下響應頭是不是設定了配置的cookie值:

看下響應頭設定了'laravel_session' cookie,并且'path','domain'是剛剛在session.php中設定的'/session','session_domain'值。總之,Laravel關閉session的第二件事就是給Response Header添加'laravel_session' cookie。
通過對Laravel Session的源碼分析可看出Session共分為三大步:啟動Session;操作Session;關閉Session。啟動Session包括Store執行個體化,從存儲媒體中如redis讀取session資料,和垃圾回收;操作Session包括對Session的CRUD增删改查操作;關閉Session包括存儲目前的URL和往Response Header添加Cookie。
總結:本小系列主要學習了Laravel Session的源碼,學習了Session的三大步。後續有好的技術再分享吧,到時見。
轉載于:https://www.cnblogs.com/grimm/p/8462322.html