小弟開發過程中遇到laravel上面不明白的地方,可能是最近才開始用這個架構的原因吧.
對於laravel session的問題還不是很瞭解,希望有研究laravel架構的朋友可以幫忙解答下我的疑問,
說下小弟開發項目的情況吧.
首先用了 laravel來建立了使用者中心系統, 然後通過session儲存在redis裡面的辦法與其他"應用",例如: 文章系統(也是laravel為架構開發)來進行使用者的登入資訊共用同步.
問題來了:
我發現兩個laravel (5.1版本) 項目之間進行session的讀寫 (我並不清楚session的id是的產生機制跟邏輯) 產生的session跟app/config裡面的檔案有關. 兩個項目隨便改下app/config裡面的設定檔都會引起session的使用者資訊無法讀取成功.
因為公司的項目不是全部用laravel (起碼短期內需要慢慢過渡)那假設, 有些項目使用TP或者CI等架構, 那這些架構要怎樣才能成功擷取laravel的session呢?
盼望高手指點,謝謝
回複內容:
小弟開發過程中遇到laravel上面不明白的地方,可能是最近才開始用這個架構的原因吧.
對於laravel session的問題還不是很瞭解,希望有研究laravel架構的朋友可以幫忙解答下我的疑問,
說下小弟開發項目的情況吧.
首先用了 laravel來建立了使用者中心系統, 然後通過session儲存在redis裡面的辦法與其他"應用",例如: 文章系統(也是laravel為架構開發)來進行使用者的登入資訊共用同步.
問題來了:
我發現兩個laravel (5.1版本) 項目之間進行session的讀寫 (我並不清楚session的id是的產生機制跟邏輯) 產生的session跟app/config裡面的檔案有關. 兩個項目隨便改下app/config裡面的設定檔都會引起session的使用者資訊無法讀取成功.
因為公司的項目不是全部用laravel (起碼短期內需要慢慢過渡)那假設, 有些項目使用TP或者CI等架構, 那這些架構要怎樣才能成功擷取laravel的session呢?
盼望高手指點,謝謝
好,我來了。
此處簡單介紹Laravel的Session機制(現學現賣,感謝題主提供機會),以下都以不加密的file模式舉例子。
Laravel是如何儲存和讀取的呢?
先說儲存,
我們可以看\Illuminate\Session\SessionManager
中的createNativeDriver
中調用了FileSessionHandler
類。
寫入的位置在PATH\storage\framework\sessions
目錄下,以id作為檔案名稱,這個id是從使用者的cookie中讀取的。
寫入不介紹了,因為題主想讀取,我這先簡單介紹下如何讀取File中Session的資料。
我們看\Illumiate\Session\Store
中的loadSession
方法,有一個調用$this->readFromHandler()
函數定義如下:
protected function readFromHandler() { $data = $this->handler->read($this->getId()); if ($data) { $data = @unserialize($this->prepareForUnserialize($data)); if ($data !== false && $data !== null && is_array($data)) { return $data; } } return []; }
我們知道如果是File那麼用的就是FileSessionHandler
, 它的read非常簡單
public function read($sessionId) { if ($this->files->exists($path = $this->path.'/'.$sessionId)) { return $this->files->get($path); } return ''; }
就是從檔案裡讀資料,完了。
所以實際情況,我們看我目錄下面的序列化的session檔案.
a:5:{s:6:"_token";s:40:"kHhZ458I4t5y2M3CMsAvLNrqy4GOOgCkRiRbhiD5";s:9:"_previous";a:1:{s:3:"url";s:16:"http://localhost";}s:5:"flash";a:2:{s:3:"old";a:0:{}s:3:"new";a:0:{}}s:38:"login_82e5d2c56bdd0811318f0cf078b78bfc";i:1;s:9:"_sf2_meta";a:3:{s:1:"u";i:1442888664;s:1:"c";i:1442887470;s:1:"l";s:1:"0";}}
嘗試unserialize,得到結果。
知道laravel儲存的位置和演算法的話,你沿著Handler的read方法,就可以讀取到你自己的framework裡了(當然需要做一個適配器進行轉換)。
有問題歡迎交流~
多應用共用為毛不用rest呢?
因為laravel的作者,覺得php系統的session一點不優雅,所以,另起爐灶自己搞了一個,
當然,是不相容php原生session的,
如果真的要多項目共用的話(不僅僅是laravel),有兩種方法,
一種就是為其他應用做一個laravel-session的相容類,但是這個成本有點高.
另外一種,就是業務裡面用到session的地方,棄用laravel session,
使用php原生session (session_start() 啟動),
這樣共用的資料所有php都看得懂了
不同系統統一登入應該自己設計一套規則和機制,其實和larval沒什麼關係
使用oauth2.0