Zend_Session SaveHandler для Memcache - PullRequest
       4

Zend_Session SaveHandler для Memcache

4 голосов
/ 06 октября 2010

Недавно обнаружил, что 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, которые вы сделали, или другие трикераты или колдовство, которые вы использовали для этой работы.

Спасибо!

1 Ответ

5 голосов
/ 07 октября 2010

Этот чуть не взорвал мою голову.

Во-первых, извините за книгу вопроса ... Я хотел нарисовать полную картину ситуации. К сожалению, я упустил несколько ключевых деталей, которые нашел мой замечательный коллега.

Итак, после установки, скорее всего, когда вы только начинаете тестировать демона, вы сделаете следующее:

root # memcached -d -u nobody -m 512 127.0.0.1 -p 11211

Эта команда запустит memcached, используя 512 МБ на локальном хосте и порт по умолчанию 11211.

Вы видели, что я там делал? Это означает, что он настроен только на обработку запросов, отправленных на сетевой интерфейс LOOPBACK.

тьфу

Моя проблема заключалась в том, что я не мог заставить мое веб-приложение работать с УДАЛЕННЫМ сервером memcached.

Итак, когда вы действительно хотите запустить сервер memcached для приема запросов от удаленных систем, вы выполняете что-то вроде следующего:

root # memcached -d -u nobody -m 512 -l 192.168.0.101 -p 11211

Это исправило мою проблему. Это запустит мой демон memcached, установив его на использование 512 МБ, привязанного к IP 192.168.0.101, и прослушивание по умолчанию порта 11211.

Теперь любые запросы, отправленные на этот IP-адрес и порт, будут приниматься сервером и обрабатываться, как вы могли ожидать.

Вот ссылка на сетевой документ ... RTFM ... во второй раз!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...