Сессии в memcached с Zend Framework
Столкнулся тут с очень странным багом. У нас в проекте реализовано централизованное хранение сессий. Т.е. разные бекэнды хранят сессии в одном месте. Это позволяет автоматически “узнавать” пользователя, вне зависимости от того с какого фронт-энда пришел запрос.
При выключенном кэше сессии хранятся в БД MySQL, при включенном в Memcached. И вот тут то и начались глюки. У нас есть основной движок на ZF, и утилитка на PHP. Утилитке надо производить авторизацию пользователя, а для этого подключаться к memcache и устанавливать session_save_handler().
Вроде делал всё как надо, но получал ошибку:
|
1 2 3 4 |
Zend_Session_Exception: Zend_Session::start() - /vendors/Zend/Cache /Core.php(Line:310): Error #8 unserialize(): Error at offset 0 of 929 bytes Array in //vendors /Zend/Session.php on line 493 Call Stack: 0.0006 665616 1. {main}() /utils/session.php:0 0.0464 2973824 2. Zend_Session::start() /utils/session.php:49 |
После этого сессия убивалась, и в основной системе юзера выкидывало.
Solution
А оказалось всё банально просто. Во-первых надо было устанавливать в утилите такие же переменные окружения для memcache, как и в дивжке:
|
1 2 3 4 5 |
resources.cachemanager.backend.memcached.ini.allow_failover = 1 resources.cachemanager.backend.memcached.ini.max_failover_attempts = 20 resources.cachemanager.backend.memcached.ini.chunk_size = 8192 resources.cachemanager.backend.memcached.ini.hash_strategy = "standard" resources.cachemanager.backend.memcached.ini.hash_function = "crc32" |
С помошью кода:
|
1 2 3 4 |
$iniSets = $options['bootstrap']['resources']['cachemanager']['backend']['memcached']['ini']; foreach ($iniSets as $name => $value) { ini_set('memcache.'.$name, $value); } |
Во-вторых, надо было отключить автоматическую сериализацию.
|
1 |
resources.cachemanager.frontend.block.options.automatic_serialization = false |
После этого сессия стала открываться как в основной системе, так и в утилите.