Пользовательский serialize_handler для настраиваемого php SessionHandler (хранилище БД)

В процессе использования управления сеансами сторонних разработчиков (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 } 

Хотя это не очень красиво и с небольшими накладными расходами, но вам нужно контролировать сериализацию при хранении, поэтому он должен сделать трюк.

Надеюсь, поможет!