PHP 與 NodeJS 如何共用 Session?


可以使用第三方的緩存工具,比如 memcached。
參考這篇文章:PHP and Node.JS session share using memcache


沒有問題描述,也不知道你都嘗試過哪些方法,只能假設你的場景是「node如何讀取php session」,這應該是最常見的情況。

PHP暴露一個Service,向Node提供Session數據

php_session.php?SID=xxxx

&

node

var request = require("request");
request("http://localhost/php_session.php?SID=xxxx", function(err, res, body) {
if (!err res.statusCode == 200) {
// 根據需要使用body(json)
}
});

這是我個人最推薦的方式,好處是實現非常簡單,也很好維護,出發點是PHP的執行環境是操作PHP session的最可靠環境;這樣一來session serialize和unserialize的細節node不需要關心,node和php打交道而不是和php session的「實現」打交道;可能的「壞處」是通過HTTP round trip發送json payload有一定的性能損失,但是這個「壞處」是不是成為一個問題,只有你自己才能衡量。當然調用方式不一定是node去請求php所提供的http介面,也可以用類似的實現讓php向node POST數據,但思路是一樣的,就是通過HTTP發送JSON payload。

另一種方法是在php里實現自己的session handler,PHP: session_set_save_handler,然後實現一個類似這樣的write方法; 實現細節可以參考@大石頭 Dion發的鏈接。

實現相對複雜,不十分推薦的原因是一個PHP的外部需求(node需要共享php的session)不應該通過改變PHP內部實現(自己的session handler)來達成,引入這種複雜度很多時候都不值得;另一個原因是有時候這需要嵌入當前系統的執行邏輯,會成為一個hack;推薦的原因是性能,因為node會和PHP的session存儲(比如memcache)直接打交道。

核彈級的解決方案是用javascript寫一個decoder,輸入php serialize(不是serialize())好的session數據,輸出是一個javascript object。

比如

輸入
name|s:3:"Tom";age|i:7
輸出
{name: "Tom", age: 7}

寫這個decoder,不像看起來那麼簡單。

如果你需要在Node裡面修改PHP的session數據,那麼下面的問題需要考慮

  1. 是否絕對必要這樣做
  2. 如果是,能否不使用PHP的session
  3. 如果是,你就很可能需要自己實現session handler,詳見 PHP: session_set_save_handler

這個實現里關鍵的問題是你不宜使用序列化後整村爭取session的方式,比如文件和memcache,比較合適的是使用一個noSQL資料庫來存儲,這樣,session內的每個欄位才可以被單獨操作而不影響其餘欄位;但無論如何,請先考慮 問題1和2。


使用一個第三方存儲如redis來保存session。


1,首先拿memcahed做session伺服器的,人作者都出了發文說memcahed本質是個緩存,不適合做session伺服器了;其次是memcahed存session的安全問題,一處後台sb注入了php代碼就很容易dump出session,具體烏雲drops有講感興趣自己搜。方案推薦redis吧,redis注意配置ip綁定和運行許可權,配置不當的redis可以拿下伺服器root的。

2,那個高票的php給nodejs提供一個服務的,你這麼做有考慮安全問題么?你這麼做等於把session全部暴露給瀏覽器端,而且node長處是io,就為了一個session handler那麼一點計算量就把php搬出來,我就問為啥node自己不可以去處理session?而且題主問node和php怎麼共享session,首先node和php肯定是不同的應用,域名也可能不同,如果是http://a.x.com和http://b.x.com這樣,那麼把sid這個和session綁定的cookie(和auth有關的設置成httponly)域設置成http://x.com這樣就能共享cookie了。。。如果域名完全不一樣,那麼當用戶在2個域名間跳轉的時候怎麼傳遞這個sid就成了問題了,我目前能想到的就是假如用戶在http://a.x.com登陸了,如果檢測到http://b.y.com沒登陸,ok,去http://a.x.com/login?return=b.y.com讓用戶登陸後給用戶一個token然後302到http://b.y.com,然後http://b.y.com拿著這個token去http://a.x.com查詢是否合法,合法的話就認為登陸成功。。。看著簡單,其實有很多需要注意的安全問題,如果不用心很難處理好,祝你好運


session還是放在伺服器端操作比較好。
可以選擇使用cookie,將cookie的生存時間expire設置為0代表隨瀏覽器關閉失效。生存效果和session差不多,前端操作就方便很多了。
note.js運行在服務端的啊?和php並行運行的話可以考慮第三方共享session了,memcache,redis,資料庫也可以。


session的目的是把數據存在伺服器的內存里,如果清楚這點,那麼找一個內存資料庫(redis,memcached...)就能達到你的目的,如果你嫌這些都還太重量級,就隨便用一個你熟悉的語言寫一個輕量級的內存資料庫就好,跨語言介面或者說是進程間通信推薦使用.sock文件。


如果是web應用, nodejs在生產環境都是多進程運行, 所以session存儲必然是進程外的, 我之前用過redis.

至於php, 我沒了解過, 如果要支持多機, 水平擴展, 類似redis的方案還是需要的

這種方案缺點就是只能保存通用數據, 不能保存對象引用什麼的.


說白了,什麼叫共用?就是同一條數據,PHP能讀,Node.js也能讀。
至於怎麼讀就得看自己了,放資料庫、Memcache、甚至你直接通過PHP留介面給Node.js(就像flamingtop提供的方法)。


建議是使用redis 或者memcached 做 session,這樣不僅node和php程序可以共享session,也不會對php、node程序造成額外的開銷。

如果是session放在node或者php程序的內存中,一來需要額外的代碼和資源維護,二來這些代碼往往不及redis等k-v資料庫的解決方案成熟,反而(如果不合理的代碼的話)是容易引起bug或者性能瓶頸的地方。比如上面有人提及的暴露php service的方法,或者是暴露node service,不說編寫、維護代碼需要人力開銷,線上每秒請求處理能力一般是 php &<~ node &<&推薦redis,php可以直接配置session方案,nodejs也有很多lib


一般的做法是使用session伺服器,使用mysql或者memcache等成熟的方案都是可行的。


第三方mm


走內存 比如memcache


用session_save_handler自己保存成json比較容易交互,也可以用我早前寫的一個node擴展:bombworm/node-serializer 路 GitHub
限制是stdClass的數據無法還原


不要搞得那麼複雜了,不同的語言要共享session,使用共享session存儲就可以了。
比如可以將session保存到mysql, memcache中,都是不錯的方案的。


從架構角度來講:有伺服器資源的nosql 沒伺服器資源的mysql內存表,不建議直接存伺服器了,因為這樣把session作為了PHP的子模塊 而不是和php nodejs同級的模塊
從業務角度:看程序員的心情吧


緩存+cookie吧。早都有人說過分散式用session你會瘋掉


用radis+memcache來維護session表,做個decay機制。


什麼是Session?

Session的實現機制就是 生成 一個 key。把這個key放入到Cookie。
生成結果越複雜越好。不然暴力可破解。
Cookie會在每次訪問的HTTP Request Header拿到。
拿到之後去伺服器之前存的地兒(不同語言略有不同)取出來。就是Session里存的東西。

無關語言,無關WebServer都是這樣實現。若想 實現共享Session。如下:

1、生成同樣的KEY。

如果想讓Nodejs PHP共享Session。則生成機制要一樣。
你可以使用 用戶的userid + salt,做sha,生成Cookie的KEY。這樣PHP和Nodejs的KEY是一樣的。

2、訪問同一個Session Storage。

通常都是用Redis-Server來做存儲。這樣就是完全共享Session了。


推薦閱讀:

是不是收到了1G的http post數據,這個進程佔用的內存就會有1G?
你怎麼用最通俗的話解釋AJAX是什麼東西?
PHP 的極限在哪裡?
kindeditor編輯器保存的文章帶html標籤,進行文章關鍵詞搜索如何排除標籤內容干擾?
PHP為什麼這麼難學?

TAG:PHP | Redis | Nodejs | session |