2010-07-12 42 views
9

我最近進入了使用node.js擴展我的網站,並已實現我需要一個會話處理程序爲我的PHP會話。現在一切都變得很酷並且很花哨,node.js讀取了php會話,並且可以將它自己的會話傳播給php。我正在使用數據庫會話,因此會話數據被保存到數據庫中的一個字段中。使用Javascript解析PHP會話

但是我發現了一個小問題。我正在嘗試將會話數據讀入node.js,它確實是一個很奇怪的字符串。我已經能夠獲取每個會話變量的strucutre到:

'field_name'|'type':'length':'value'; 

現在對某些字符串值字段可缺少其他字符串的長度可能會缺失(當變量爲空)。該類型也可以比b,s,i多;它也可以是N(NULL)。

我原本以爲一個JS的巨大翻譯,但這只是某種程度上似乎是一個非常錯誤的方式來做到這一點。

有沒有人試圖在JS中提取php會話變量之前,有沒有什麼樣的腳本可以幫助?也許有一個格式化的東西,我可以在PHP方面使用,使我的生活在node.js更容易嗎?

編輯:架構的樣子:

{ _id: { id: 'L:\u00c1\u009d\u008e\u00ad\u000e}<\u0002\u0000\u0000' } 
, session_id: 'a2clfnjhopv1srs5k5elgbfjv5' 
, user_id: 0 
, session_data:  'logged|b:0;uid|i:0;server_key|N;AUTH_TIER2|b:0;email|s:0:"";cheese|s:6:"cheese";' 
, active: 1 
, expires: 1278920567 
} 

這是一個用戶會話蒙戈DB記錄。需要翻譯的字段是session_data。當粘貼它時,會出現某種格式錯誤,因爲當我嘗試將其作爲代碼使用時,由於stackoverflow不會將其格式化爲代碼。

我試圖JSONfy前場,但它失去了它的類型和沒有讀空條目等,所以我停止的

感謝,

+1

我還沒有和node.js中工作過。在將它傳遞給node.js之前,是否可以[PHP] _php.net/manual/en/function.json-encode.php PHP中的非序列化會話數據? – Gordon 2010-07-12 08:11:51

+0

你可以顯示一個例子而不是模式嗎?缺少什麼東西時它看起來如何? – galambalazs 2010-07-12 08:37:05

+0

我添加了模式,雖然正如我所說的那樣粘貼它時存在某種錯誤,並且stackoverflow不會將數據格式化爲代碼:(。galam,因爲我也在編輯中聲明我嘗試過JSON,但它似乎打破了字符串使得它不可能檢索會話數據:(。也許有一些東西在那,但是,如果我做一個節點字段並將會話數據複製到一個json字符串中...併爲該字段創建一個dejsonifier .... hmmmm可以工作 – Sammaye 2010-07-12 09:10:24

回答

5

我比較肯定PHP使用序列化和反序列化功能處理會話數據。

有一個JavaScript實現的PHP.JS反序列化的,你可以在這裏找到:力PHP使用JSON代替:

使用http://phpjs.org/functions/unserialize

+0

那是一個性感我看到他們也有序列化,所以我會嘗試一下。我需要php.js來使用這些腳本還是他們聲明的依賴關係? – Sammaye 2010-07-12 09:22:12

+0

我自己並沒有使用PHP.JS,但我認爲你可以照片k你想要的特定功能和他們的代價如果有的話 – 2010-07-12 10:55:11

+0

@Jani我不確定這是用serialize/unserialize處理的,而是用session_encode/session_decode – Gordon 2010-07-12 17:15:55

3

只是爲了我發現的方式回覆下面的類,使用session_set_save_handler將數據存儲爲JSON,並讓PHP仍然使用他自己的系統。 鏈接這個類使用此功能在每次使用會話腳本的開頭: http://php.net/manual/ru/function.session-set-save-handler.php

PS:這裏的類使用內存緩存來存儲JSON生成的對象,對Node.js的,使用的memcache對象,並檢索像這樣:

  • 從餅乾得到PHPSESSID
  • 使用的字符字符串帶來了關鍵從「會話/ ID」其中id是關鍵,會議只是字符串的memcached(見下類)。

現在你應該在memcache中只有JSON,所以它變成了一個簡單的Node.JS遊戲。

PS:當然,你可以工作/改善這一點,你也可以使用此不僅與內存緩存(例如DB)

<?php 
/** 
* This class is used to store session data with memcache, it store in json the session to be used more easily in Node.JS 
*/ 
class memcacheSessionHandler{ 
    private static $lifetime = 0; 
    private static $memcache = null; 

    public function __construct(){ 
      self::$memcache = new Memcache(); 
      self::$memcache->addServer('localhost', 11211); 
} 

    public function __destruct(){ 
      session_write_close(); 
      self::$memcache->close(); 
      self::$memcache = null; 
    } 

    public static function open(){ 
      self::$lifetime = ini_get('session.gc_maxlifetime'); 
      return true; 
    } 

    public static function read($id){ 
      $tmp = $_SESSION; 
      $_SESSION = json_decode(self::$memcache->get("sessions/{$id}"), true); 
      $new_data = session_encode(); 
      $_SESSION = $tmp; 
      return $new_data; 
    } 

    public static function write($id, $data){ 
      $tmp = $_SESSION; 
      session_decode($data); 
      $new_data = $_SESSION; 
      $_SESSION = $tmp; 
      return self::$memcache->set("sessions/{$id}", json_encode($new_data), 0, self::$lifetime); 
    } 

    public static function destroy($id){ 
      return self::$memcache->delete("sessions/{$id}"); 
    } 

    public static function gc(){ 
      return true; 
    } 

    public static function close(){ 
      return true; 
    } 
} 
?> 
2

我有同樣的問題。我需要整合phpnode.js。我用js-php-unserialize來做到這一點。使用非常簡單。

var PHPUnserialize = require('php-unserialize'); 
console.log(PHPUnserialize.unserializeSession(yourData)); 

例如,如果你

var yourData = 'A|s:1:"B";userID|s:24:"53d620475e746b37648b4567";'; 

,你會得到這樣的結果:

{ 
    A: 'B', 
    userID: '53d620475e746b37648b4567' 
}