Сессии в memcached с Zend Framework

// Июнь 30th, 2010 // 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

После этого сессия стала открываться как в основной системе, так и в утилите.

Share

Спасибо!


Если вам помогла статья, или вы хотите поддержать мои исследования и блог - вот лучший способ сделать это:


7 Responses to “Сессии в memcached с Zend Framework”

  1. Mmogold:

    У каждого своё мнение и вижу что вы в этом понимаете. Интересно а свой сайт вы купили или сами создали? Очень хорошо всё описано спс.
    P.S. Может разместите мою ссылку у себя на блоге может и получится заработать на нём.

  2. Feminissimo:

    Было бы интересно узнать поподробнее может у вас есть ещё что не выложили тут буду ждать обновлений.

  3. Delpan:

    Очень интересная идея,нужно подумать и мне об этом

  4. […] только когда для хранения сессий используется ZendExtra_Session_SaveHandler_Memcached. Когда же используется Zend_Session_SaveHandler_DbTable и сессии […]

Комментировать