2012-03-30 12 views
6

php内で第三者(django)セッション管理を使用するプロセスでは、カスタムシリアル化関数を使用して、djangoの塩漬けストレージに適切にエンコード/セッションデータの現在、ini設定のsession.serialize_handlerはphpまたはwddxのいずれかになります。カスタムphp SessionHandler(DBストレージ)用のカスタムserialize_handler

カスタムserialize_handlerをクラスとして設定する方法はありますか?

class CustomSessionSerializer { 

    public static function serialize($data){ 
    // Serializes raw data 
    } 

    public static function unserialize($sdata){ 
    // Deserializes serialized data 
    } 
} 

をし、それは私のカスタムSessionHandlerで使用している:

私はこのような何かを持っているしたいと思います。

igbinary project on githubカスタムserialize_handlerをPHP拡張モジュールとして追加しているようです。 カスタムシリアル化がC拡張ではなく別の場所で実行できないのが不思議です。

+0

github(https://github.com/igbinary/igbinary)のigbinaryプロジェクトは、カスタムシリアル化を実現しているようですが、これはPHPのカスタマイズの予想をはるかに超えています。 –

+0

あなたは '$ _SESSION'スーパーグローバル全体を引き継ぎ、セッション関連のものすべてを自分で書くのでない限り、プレーンなPHPで行うことはできないと思います。 –

答えて

0

あなたがSessionHandlerInterfaceを使用することができますPHP 5.4で

独自のセッション処理関数を使用するsession_set_save_handler()を使用することができます。

デフォルトでは、すでにシリアル化されたデータを受信するので、シリアル化を解除して独自のシリアル化ルーチンを使用する必要があります。

+0

クラック、もしあなたが私の質問をよく見ていれば、私はすでにカスタムセッションハンドラを設定していることがわかります。このステップは、読み込み直前と書き込み直後に行われるため、カスタム直列化についての質問があります。 –

+0

あなたはsession.serialize_handlerでできること(プレーンまたはPHP拡張機能)、または 'read'と' write'ハンドラを使用し、カスタムの直列化 - > PHP直列化/ PHP直列化 - >カスタム直列化を行うことができます。 – Crack

0

回避策のように見えるかもしれませんが、必要なのは実行します。シリアライズは、カスタムセッションハンドラが$_SESSIONスーパーグローバルを受け取ったときに適用され、シリアライズされた読み取りハンドラから返す必要があります。しかし、任意のシリアライゼーションやフォーマット、または必要なものとしてセッションを保存することができます。

class SessionHandler { 

    public function __construct() { 
     session_set_save_handler(
      array($this, 'open') 
      ,array($this, 'close') 
      ,array($this, 'read') 
      ,array($this, 'write') 
      ,array($this, 'destroy') 
      ,array($this, 'gc') 
     ); 
    } 

    public function open($savePath, $sessionName) { 
     return true; 
    } 

    public function close() { 
     return true; 
    } 

    public function read($id) { 
     $data = CustomStorage::fetchSessionData($id); 
     return serialize(
      CustomSerialization::unserialize($data); 
     ); 
    } 

    public function write($id, $serializedData) { 
     CustomStorage::writeSessionData(
      $id 
      ,CustomSerialization::serialize(unserialize($serializedData)) 
     ); 
     return true; 
    } 

    //gc and destroy 
} 

かわいいとオーバーヘッドのビットではないが、しかし、あなただけの保存時に直列化を制御する必要があるので、それはトリックを行う必要があります。

希望すると助かります!

+0

ありがとうございます。残念ながら、session_encodeが呼び出されたときに奇妙なシリアライゼーションが発生しているように見えますが、このステップをキャンセルすることはできません –

2

私はこの問題に取り組んできましたが、これには解決策があります。

session.serializer_handlerをPHPから簡単に変更できますが、シリアライザを実行する前に$ _SESSIONの内容を空にすることができます。ここでregister_shutdown_functionsave_handler$ _SESSIONコンテンツのコピーに戻されている機能を、登録されている(のZend \セッション\ SessionManagerののような)セッションの投与のためのクラスを使用して
、その後$ _SESSIONは空です。

シリアライザは実行されますが、空の文字列で実行され、カスタムシリアル化はカスタムsave_handlerで実行されます。

関連する問題