自定义php SessionHandler(DB存储)的自定义序列化\u处理程序

自定义php SessionHandler(DB存储)的自定义序列化\u处理程序,php,session,serialization,Php,Session,Serialization,在php中使用第三方(django)会话管理的过程中,我需要使用自定义序列化函数,以便对其进行适当的编码/解码,以适合django对会话数据的存储。目前,ini设置session.serialize_处理程序可能是php或wddx 有没有办法将自定义序列化\u处理程序设置为类 我想要这样的东西: class CustomSessionSerializer { public static function serialize($data){ // Serializes raw d

在php中使用第三方(django)会话管理的过程中,我需要使用自定义序列化函数,以便对其进行适当的编码/解码,以适合django对会话数据的存储。目前,ini设置session.serialize_处理程序可能是php或wddx

有没有办法将自定义序列化\u处理程序设置为类

我想要这样的东西:

class CustomSessionSerializer {

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

    public static function unserialize($sdata){
    // Deserializes serialized data
    }
}
并让我的自定义SessionHandler使用它

似乎添加了一个自定义序列化\u处理程序作为php扩展我很好奇自定义序列化是否可以在C扩展之外的其他地方进行。

您可以使用自己的会话处理函数

在PHP5.4中,您可以使用


默认情况下,您将接收已序列化的数据,因此您必须取消序列化并使用自己的序列化例程。

可能看起来像是一种解决方法,但它可以满足您的需要。当自定义会话处理程序接收到
$\u会话
超全局,并且需要从读取处理程序将其序列化返回时,将应用序列化。但是,您可以将会话存储为任何序列化、格式或任何您想要的内容

范例

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
}
虽然不是很漂亮而且有点开销,但是您只需要在存储时控制序列化,所以它应该可以做到这一点


希望有帮助

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

其思想是,尽管您可以轻松地从PHP修改
会话.serializer\u处理程序
,但您可以在运行序列化程序之前清空
$\u会话
的内容。
使用一个类来管理会话(如Zend\session\SessionManager),其中注册了
register\u shutdown\u函数
一个函数,在该函数中,会传回
save\u handler
会话内容的副本,然后
$\u session
为空


因此序列化程序只在空字符串上运行,而自定义序列化是在github()上的自定义
save\u处理程序上执行的

igbinary项目似乎实现了自定义序列化,但这远远超出了我对php自定义的预期。我认为不可能在普通php中实现,除非你接管整个
$\u会话
superglobal并自己编写与会话相关的所有内容。Crack,如果你仔细看看我的问题,你会发现我已经设置了自定义会话处理程序。问题是关于自定义序列化的,因为此步骤发生在读取之前和写入之后。您只需知道session.serialize_处理程序允许您做什么(普通或使用PHP扩展),或者使用
read
write
处理程序,并在其中执行自定义非序列化->PHP序列化/PHP非序列化->自定义序列化。感谢capi,不幸的是,调用session_encode时似乎会发生奇怪的序列化,我觉得这一步似乎无法取消