2008-09-16 6 views
20

PHP хранит информацию о сеансе в файловой системе хоста сервера, устанавливающего этот сеанс. В среде PHP с несколькими хостами, где нагрузка нераспределяется между каждым хостом, переменные сеанса PHP недоступны для каждого запроса (если только случайный запрос не назначен на тот же хост - предположим, что у нас нет контроля над балансировщиком нагрузки) ,Каков наилучший способ обработки сеансов для PHP-сайта на нескольких хостах?

This site, dubbed "The Hitchhikers Guide to PHP Load Balancing" предлагает переопределить обработчик сеанса PHP и хранить информацию сеанса в общей базе данных.

Что, по вашему скромному мнению, является наилучшим образом способ поддерживать информацию о сеансе в среде с несколькими PHP-хостами?

ОБНОВЛЕНИЕ: Спасибо за отличную обратную связь. Для тех, кто ищет пример кода, мы нашли useful tutorial on writing a Session Manager class for MySQL, который я рекомендую проверить.

ответ

14

База данных или База данных + Memcache. Вообще говоря, сеансы не следует писать очень часто. Начните с решения базы данных, которое записывает только в db, когда данные сеанса изменены. Memcache следует добавлять позже как повышение производительности. Решение db будет очень быстрым, потому что вы только всегда просматриваете первичные ключи. Убедитесь, что db имеет блокировку строки, а не блокировку таблицы (myISAM). MemCache - это плохая идея ... Если он переполняется, сбой или перезапуск, пользователи будут выходить из системы.

+0

Althought я согласен, что DB + memcached - лучшее решение, я не буду так бояться, что он сбой будет больше, чем БД. и когда он переполняется, он должен начинаться с самых старых записей, поэтому принудительный выход будет самым ленивым пользователям. не так уж плохо, если это редко встречается – Javier 2008-10-22 16:58:24

1

Сохранение данных сеанса в совместно используемом db работает, но может быть медленным. Если это действительно большой сайт, memcache, вероятно, лучший вариант.

1

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

2

Независимо от того, что вы делаете, не храните его на самом сервере (даже если вы используете только один сервер или в сценарии перехода на 1 + 1). Это поставит вас в тупик.

Я бы сказал, используйте базу данных + Memcache для хранения/извлечения, это удержит вас от понимания Зенда (и, поверьте, в какой-то момент у меня с Zend). Поскольку вы сможете легко разделять с помощью UserID или SessionID, даже если вы перейдете к MySQL, вы оставите вещи достаточно масштабируемыми.

(Edit: кроме того, происходит с БД + Memcache не связывает вас с комерческих партии, он не связывает вас с PHP либо - то, что вы могли бы быть счастливым вниз по дороге)

+0

Хороший вопрос о том, чтобы не быть привязанным к PHP. Для этого также стоит сериализовать сеанс для JSON, а не собственный формат PHP – 2012-07-29 15:47:55