用于自定义php SessionHandler的自定义serialize_handler(数据库存储)

时间:2012-03-30 18:02:36

标签: php session serialization

在php中使用第三方(django)会话管理的过程中,我需要自定义序列化功能才能正确编码/解码,以适应django对会话数据的盐渍存储。目前,似乎ini设置session.serialize_handler可以是php或wddx。

有没有办法将自定义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扩展。

3 个答案:

答案 0 :(得分:2)

我一直在处理这个问题,并且有一个解决方案。

我们的想法是,虽然您可以轻松地从PHP修改session.serializer_handler,但您可以在运行序列化程序之前清空$ _SESSION的内容。
使用一个类来管理会话(如 Zend \ Session \ SessionManager ),其中向register_shutdown_function一个函数注册了一个函数,其中传递回save_handler一个副本$ _SESSION内容然后$ _SESSION为空。

以便序列化程序在空字符串上运行,并在自定义save_handler上执行自定义序列化。

答案 1 :(得分:0)

您可以使用session_set_save_handler()来使用自己的会话处理功能

在PHP 5.4中,您可以使用SessionHandlerInterface

默认情况下,您将收到已经序列化的数据,因此您必须对其进行反序列化并使用自己的序列化例程。

答案 2 :(得分: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
}

虽然不是很漂亮且有一点开销,但你只需要在存储时控制序列化,所以它应该可以解决问题。

希望它有所帮助!