在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扩展。
答案 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
}
虽然不是很漂亮且有一点开销,但你只需要在存储时控制序列化,所以它应该可以解决问题。
希望它有所帮助!