// 30 июня, 2010 // 7 комментариев » // Memcached, Zend Framework
Столкнулся тут с очень странным багом. У нас в проекте реализовано централизованное хранение сессий. Т.е. разные бекэнды хранят сессии в одном месте. Это позволяет автоматически «узнавать» пользователя, вне зависимости от того с какого фронт-энда пришел запрос.
При выключенном кэше сессии хранятся в БД MySQL, при включенном в Memcached. И вот тут то и начались глюки. У нас есть основной движок на ZF, и утилитка на PHP. Утилитке надо производить авторизацию пользователя, а для этого подключаться к memcache и устанавливать session_save_handler().
Вроде делал всё как надо, но получал ошибку:
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, как и в дивжке:
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"
С помошью кода:
$iniSets = $options['bootstrap']['resources']['cachemanager']['backend']['memcached']['ini'];
foreach ($iniSets as $name => $value) {
ini_set('memcache.'.$name, $value);
}
Во-вторых, надо было отключить автоматическую сериализацию.
resources.cachemanager.frontend.block.options.automatic_serialization = false
После этого сессия стала открываться как в основной системе, так и в утилите.