Недавно обнаружил, что DbTable SaveHandler Zend_Session реализован способом, который не очень оптимизирован для высокой производительности, поэтому я исследовал переход на использование Memcache для управления сессиями.
Я нашел приличный шаблон / класс для изменения Zend_Session SaveHandler в моем загрузчике с DbTable на Memcache здесь и добавил его в мое веб-приложение.
В моей начальной загрузке я изменил SaveHandler следующим образом:
ОТ:
Zend_Session::setSaveHandler(new Zend_Session_SaveHandler_DbTable($config));
TO:
Zend_Session::setSaveHandler(new MyApp_Session_SaveHandler_Memcache(Zend_Registry::get("cache")));
Итак, мой сеанс init выглядит так:
Zend_Loader::loadClass('MyApp_Session_SaveHandler_Memcache');
Zend_Session::setSaveHandler(new MyApp_Session_SaveHandler_Memcache(Zend_Registry::get("cache")));
Zend_Session::start();
// set up session space
$this->session = new Zend_Session_Namespace('MyApp');
Zend_Registry::set('session', $this->session);
Как вы можете видеть, класс, предоставленный с этого сайта, быстро интегрируется с простым изменением loadClass и SaveHandler в начальной загрузке, и он работает в моем локальном dev env без ошибок (веб-приложение и memcache находятся в одной системе).
Я также протестировал свое веб-приложение, размещенное в локальной среде dev env, на удаленном сервере memcache в PROD, чтобы увидеть, как оно работает по проводам, и, похоже, оно тоже работает нормально.
Тем не менее, в моей промежуточной среде (которая имитирует производство) мое приложение zend размещено на сервере server1, а memcache на сервере server2, и кажется, что почти каждый второй запрос полностью разлетается с конкретными сообщениями об ошибках.
Информация об ошибке, которую я получаю, включает в себя сообщение «Сессия уже была запущена сессией .auto-start или session_start ()», а параметр second / related указывает, что Zend_Session :: start () получил Соединение, отклоненное с «Ошибка № 8 MemcachePool :: get () ", включенный в строку 180 в файле инфраструктуры ./Zend/Cache/Backend/Memcached.php.
Я подтвердил, что в моем php.ini для session.auto_start задано значение 0, и единственный экземпляр Zend_Session :: start () в моем коде находится в моем загрузчике. Кроме того, я запускаю Cache, Db и Helpers перед тем, как начать сеанс (чтобы убедиться, что мой аргумент Zend_Registry :: get ("cache") для создания экземпляра моего нового SaveHandler действителен.
Я нашел только около двух ценных ресурсов, как успешно использовать Memcache для Zend_Session, и я также рассмотрел документы ZF Zend_Cache_Backend и Zend_Session «Расширенное использование», но я не смог определить источник, почему я получаю эту ошибку, Memcache или почему он не будет работать согласованно с выделенным / удаленным сервером memcache.
- Кто-нибудь понимает эту проблему?
- У кого-нибудь есть опыт решения этой проблемы?
- У кого-нибудь есть Memcache, работающий в их веб-приложении ZF для управления сеансом способом, который они могут порекомендовать?
Пожалуйста, обязательно включите все / все конфигурации Zend_Session и / или Zend_Cache, которые вы сделали, или другие трикераты или колдовство, которые вы использовали для этой работы.
Спасибо!