laravel session 共用問題

來源:互聯網
上載者:User
小弟開發過程中遇到laravel上面不明白的地方,可能是最近才開始用這個架構的原因吧.
對於laravel session的問題還不是很瞭解,希望有研究laravel架構的朋友可以幫忙解答下我的疑問,
說下小弟開發項目的情況吧.

首先用了 laravel來建立了使用者中心系統, 然後通過session儲存在redis裡面的辦法與其他"應用",例如: 文章系統(也是laravel為架構開發)來進行使用者的登入資訊共用同步.

問題來了:

  1. 我發現兩個laravel (5.1版本) 項目之間進行session的讀寫 (我並不清楚session的id是的產生機制跟邏輯) 產生的session跟app/config裡面的檔案有關. 兩個項目隨便改下app/config裡面的設定檔都會引起session的使用者資訊無法讀取成功.

  2. 因為公司的項目不是全部用laravel (起碼短期內需要慢慢過渡)那假設, 有些項目使用TP或者CI等架構, 那這些架構要怎樣才能成功擷取laravel的session呢?

盼望高手指點,謝謝

回複內容:

小弟開發過程中遇到laravel上面不明白的地方,可能是最近才開始用這個架構的原因吧.
對於laravel session的問題還不是很瞭解,希望有研究laravel架構的朋友可以幫忙解答下我的疑問,
說下小弟開發項目的情況吧.

首先用了 laravel來建立了使用者中心系統, 然後通過session儲存在redis裡面的辦法與其他"應用",例如: 文章系統(也是laravel為架構開發)來進行使用者的登入資訊共用同步.

問題來了:

  1. 我發現兩個laravel (5.1版本) 項目之間進行session的讀寫 (我並不清楚session的id是的產生機制跟邏輯) 產生的session跟app/config裡面的檔案有關. 兩個項目隨便改下app/config裡面的設定檔都會引起session的使用者資訊無法讀取成功.

  2. 因為公司的項目不是全部用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

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.