2010-07-12 3 views
9

최근에 node.js를 사용하여 사이트를 확장했으며 PHP 세션을위한 세션 핸들러가 필요합니다. 이제 모든 것이 멋지다. 멋지다. node.js는 PHP 세션을 읽고 php 세션과 자신의 세션을 전파 할 수있다. 세션 데이터가 데이터베이스의 필드에 저장되도록 데이터베이스 세션을 사용하고 있습니다.자바 스크립트에서 PHP 세션을 구문 분석합니다.

그러나 나는 약간의 문제를 발견했습니다. node.js로 세션 데이터를 읽으려고하는데 정말 이상한 문자열입니다. 나는 아래 각 세션 변수의 strucutre를 얻을 수 있었다 :

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

특정 문자열을 값 필드 (변수가 null 인 경우) 길이는 누락 될 수있는 다른 문자열에 누락 될 수 있습니다. 유형은 b, s, i 이상일 수도 있습니다. N (NULL) 일 수도 있습니다.

원래 JS에 대한 거대한 번역기를 생각해 보았습니다.하지만이 방법을 사용하는 것은 매우 잘못된 방법으로 보입니다.

여기 누구든지 JS에서 PHP 세션 변수를 추출하려고했는데 도움이 될만한 스크립트가 있습니까? 어쩌면 node.js에서 훨씬 편하게 PHP를 사용할 수있는 서식 지정 방법이 있을까요?

{ _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을 시도했지만 그것은 종류의 손실 및 null 항목을 읽어 보지 않았 등 내가

감사합니다,

+1

합니다. node.js에 전달하기 전에 PHP에서 직렬화되지 않은 세션 데이터를 ['json_encode'] (http://uk2.php.net/manual/en/function.json-encode.php) 할 수 있습니까? – Gordon

+0

스키마 대신 예제를 표시 할 수 있습니까? 뭔가 빠졌을 때 어떻게 보이나요? – galambalazs

+0

나는 그것을 붙여 넣을 때 어떤 종류의 오류가 있다고 말했지만 스키마를 추가했는데 stackoverflow는 데이터가 코드가되도록하지 않았다. (galam, 편집에 JSON을 시도했으나 문자열을 세션 데이터를 검색 할 수 없게 만드는 :(. 아마도 노드 필드를 만들고 json 문자열로 세션 데이터를 복사하면 ... 그 필드에 dejsonifier를 만듭니다. hmmmm은 코드를 수정하기 위해 – Sammaye

답변

5

내가 PHP가 직렬화 때 unserialize 함수를 사용하여 상대적으로 확신 것을 중지 세션 데이터를 처리합니다.

PHP.JS에서 때 unserialize의 자바 스크립트 구현이있다, 당신은 여기를 찾을 수 있습니다 대신 JSON을 사용하는 힘 PHP :

사용 http://phpjs.org/functions/unserialize

+0

그 중 하나가 섹시합니다. 스크립트 Ima 시도해보십시오. 연재물을 보았습니다. 그래서 시도해 볼 것입니다.이 스크립트를 사용하려면 php.js가 필요하며, PHP가 사용하는 종속성은 필요합니까? – Sammaye

+0

PHP.JS를 사용하지 않았지만 당신이 단지 사진을 찍을 수 있다고 생각해. 당신이 원하는 특정 기능과 그들의 deps 만약 있다면 –

+0

@ Jani serialize/unserialize로 처리되는 것이 아니라, session_encode/session_decode로 처리 될지 모르겠다. – Gordon

3

은 그냥 내가 찾은 방법을 회신 아래의 클래스는 session_set_save_handler를 사용하여 데이터를 JSON으로 저장하고 PHP는 여전히 자신의 시스템을 사용합니다. 링크는 세션 사용하는 각 스크립트의 시작 부분에이 기능을 사용하여이 클래스 : Node.js를에, JSON 결과 객체를 저장 memcache 실행 객체를 사용하여 다음과 같이 검색하려면 여기를 클래스 사용 memcache에을 : http://php.net/manual/ru/function.session-set-save-handler.php

PS :

  • 쿠키에서 ID가 키와 세션 단지 문자열 "세션/ID"로 memcached를에서 문자열을 문자 키를 가져
  • 사용을 PHPSESSID를 얻을 수 (아래 클래스를 참조하십시오).

이제 memcache에 JSON 만 있어야하므로 Node.JS와 함께 사용하면 간단한 게임이됩니다.

PS : 당신은/작업 할 수이 향상, 당신은 또한뿐만 아니라 memcache에 (예를 들어, 데시벨) 여기

<?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";'; 

이 결과를 얻을 것이다 경우 : 내가 전에 Node.js를 함께 일하지 않은

{ 
    A: 'B', 
    userID: '53d620475e746b37648b4567' 
} 
관련 문제