Ajax, PHP и Sessions проблема - PullRequest
       8

Ajax, PHP и Sessions проблема

3 голосов
/ 13 октября 2009

У меня есть PHP-приложение, которое использует Zend Framework, jQuery's ajax и Zend_Session. Это приложение существует около 7 месяцев и работает так, как должно. Когда приложение инициализируется после входа пользователя в систему, запускается около 10 запросов Ajax для загрузки соответствующих данных на страницу типа панели мониторинга. После того, как эти запросы завершены, запросы Ajax в основном инициируются пользователем с этого момента. Когда приложение работало должным образом, у нас не было действительно сбалансированной нагрузки, у нас было 3 сервера приложений, которые обрабатывали запросы, но каждый из них хранил данные сеанса PHP локально. Недавно мы изменили это так, чтобы каждый сервер приложений был подключен к центральному общему ресурсу NFS, где хранятся данные сеанса PHP. Вот когда приложение сломалось.

Теперь, когда происходит инициализация страницы, я вижу ожидающие ajax-запросы, но у половины из них время ожидания. Если я буду ждать достаточно долго (около 3-10 минут), то все клики, инициированные пользователем, будут реагировать быстро. Мы убедились, что проблема была вызвана нашим изменением в обработке сеанса.

У кого-нибудь есть объяснение того, что может происходить, как устранить неполадки и / или решение?

Я очень ценю любую помощь, которую вы можете оказать. Я выдернул себе волосы над этим.

Ответы [ 3 ]

4 голосов
/ 13 октября 2009

Для меня быстрое и простое решение - хранить сессии в БД, не так ли? :) http://framework.zend.com/manual/en/zend.session.savehandler.dbtable.html

2 голосов
/ 13 октября 2009

Может быть несколько проблем.

  • Смонтируйте общий ресурс NFS с параметром noac, чтобы попытаться предотвратить устаревшие копии ( Что такое целостность кэша, близкого к открытому? * ).
  • NFS медленная
  • Файл заблокирован (session_write_close() вызывается?) Или не записан в файл, а только в локальной памяти сервера
  • Известны проблемы при использовании наборов фреймов (см. Документацию по сеансу php)
  • Могут также возникнуть проблемы при смене доменов (a.domain.com, b.domain.com)
2 голосов
/ 13 октября 2009

Это распространенная проблема. Вероятно, вы столкнулись с проблемой блокировки сеанса. Обработчик сохранения сеанса по умолчанию, который использует PHP, обработчик файлов (и тот, который Zend_Session использует по умолчанию), использует системный вызов flock () для блокировки файлов сеанса.

Как вы выбираете, на какой сервер отправлять отдельные HTTP-запросы? Если это просто случайный случай, и любой данный запрос может быть обработан любым из серверов, то вы можете легко представить себе сценарий, когда сервер 1 обрабатывает первоначальный запрос, создает файл сеанса на общем ресурсе NFS, получает и сохраняет блокировку на этот файл.

Следующий запрос AJAX поступает на другой сервер, где процесс PHP на этом сервере считывает идентификатор сеанса из файла cookie клиента и пытается заблокировать файл сеанса на общем ресурсе NFS. Поскольку первый сервер все еще имеет блокировку файла, вы заблокированы и ждете.

Это может быть причиной этого. Это довольно часто, когда вы начинаете пытаться балансировать нагрузку PHP.

Некоторые балансировщики нагрузки имеют режим, который обеспечивает «липкие сеансы», когда балансировщик достаточно умен, чтобы просматривать идентификатор сеанса по проводам и гарантировать, что тот же физический сервер обрабатывает все запросы для данного сеанса. Это может сделать балансировку нагрузки менее эффективной, но оно того стоит, чтобы избавиться от проблемы.

Или проблема может быть связана с чем-то другим. Я не знаю.

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