HTTP является протоколом без сохранения состояния по причине. Сеансы сваривают состояние по HTTP. Как правило, избегайте использования состояния сеанса.
ОБНОВЛЕНИЕ: нет концепции сеанса на уровне HTTP; серверы предоставляют это, предоставляя клиенту уникальный идентификатор и сообщая ему о необходимости повторной отправки при каждом запросе. Затем сервер использует этот идентификатор в качестве ключа в большой хэш-таблице объектов Session. Всякий раз, когда сервер получает запрос, он ищет информацию о сеансе в своей хэш-таблице объектов сеанса на основе идентификатора, предоставленного клиентом вместе с запросом. Вся эта дополнительная работа - двойной удар по масштабируемости (большая причина, по которой HTTP не сохраняет состояния).
- Whammy One: он уменьшает работу, которую может выполнять один сервер.
- Whammy Two: это усложняет масштабирование, потому что теперь вы не можете просто направить запрос на какой-либо старый сервер - они не все имеют одинаковый сеанс. Вы можете закрепить все запросы с данным идентификатором сессии на одном сервере. Это не просто, и это единственная точка отказа (не для системы в целом, а для больших групп ваших пользователей). Или вы можете разделить хранилище сеансов между всеми серверами в кластере, но теперь у вас есть больше сложностей: подключенная к сети память, автономный сервер сеансов и т. Д.
Учитывая все это, чем больше информации вы добавляете в сеанс, тем больше влияние на производительность (как указывает Винко). Также, как указывает Винко, если ваш объект не сериализуем, сеанс будет вести себя неправильно. Поэтому, как правило, избегайте внесения в сессию большего, чем необходимо.
@Vinko Обычно вы можете обойти состояние хранилища сервера, внедрив данные, которые вы отслеживаете, в ответ, который вы отправляете обратно, и попросив клиента отправить его повторно, например, отправив данные в скрытый вход. Если вам действительно нужно отслеживание состояния на стороне сервера, оно, вероятно, должно быть в вашем резервном хранилище данных.
(Винко добавляет: PHP может использовать базу данных для хранения информации о сеансе, и если клиент повторно отправляет данные каждый раз, это может решить потенциальные проблемы с масштабируемостью, но открывает большой круг вопросов безопасности, на которые нужно обратить внимание, поскольку клиент контролирует все ваше состояние)