В процессе использования управления сеансами сторонних разработчиков (django) в php мне нужно иметь пользовательские функции сериализации для правильного кодирования / декодирования, чтобы соответствовать соленному хранилищу данных сеанса 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 на github, похоже, добавляет пользовательский serialize_handler как расширение php. Мне любопытно, если обычная сериализация не может произойти в другом месте, кроме как расширение C.
Я столкнулся с этой проблемой, и для этого есть решение.
Идея состоит в том, что, хотя вы можете легко модифицировать session.serializer_handler
с PHP, вы можете очистить содержимое $ _SESSION
до запуска сериализатора.
Использование класса для администрирования сеанса (например, Zend \ Session \ SessionManager ), в котором зарегистрирована функция register_shutdown_function
, в которую возвращается обратно save_handler
копия содержимого $ _SESSION
а затем $ _SESSION
пуст.
Так что сериализатор работает, но на пустой строке, и пользовательская сериализация выполняется на вашем пользовательском save_handler
.
Вы можете использовать session_set_save_handler () для использования ваших собственных функций обработки сеанса
В PHP 5.4 вы можете использовать SessionHandlerInterface .
По умолчанию вы получите уже сериализованные данные, поэтому вам придется их неэтериализовать и использовать свои собственные процедуры сериализации.
Может показаться, что он работает, но он делает то, что вам нужно. Сериализация применяется, когда ваш пользовательский обработчик сеанса получает $_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 }
Хотя это не очень красиво и с небольшими накладными расходами, но вам нужно контролировать сериализацию при хранении, поэтому он должен сделать трюк.
Надеюсь, поможет!