Задать вопрос

Создавать сессии только для залогиненых пользователей?

Механизм сессий в php таков, что для каждого уникального посетителя на сервере создается файл идентификатор сессии. С наплывом посетителей файлов стало создаваться чрезмерно много.
Хочу посоветоваться, имеет ли смысл запускать сессию исключительно для залогиненых пользователей поскольку последних намного меньше?

Если у клиента есть куки с session id, значит клиент залогинен то запускать session_start()
Если куки нет — значит не залогинен, сессию не запускаем.

Подскажут ли уважаемые гуру, поможет ли это выиграть в производительности сервера?
  • Вопрос задан
  • 6125 просмотров
Подписаться 7 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 11
rakot
@rakot
Храните сессии в Redis
Ответ написан
@Vampiro
ИМХО вы не в ту сторону копаете. Создание файла крайне дешевая операция, лучше оптимизируйте свой «битрикс»…
Ответ написан
Комментировать
cronfy
@cronfy
Следствие присутствия session_start() в начале скрипта таково: если клиент не поддерживает куки, то файл сессии создается на каждый запрос. А всякие роботы довольно часто куки не поддерживают.

Еще раз — на каждый запрос робота создается новый файл сессии.

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

Поэтому рекомендация такая: храните сессии для пользователей, которые сохраняют ваши куки. Ставим куку, проверяем на следующем запросе, есть ли эта кука, если есть — можно запускать session_start().

Вариант проще, без кук, и будет создаваться еще меньше сессий: создавать сессию только для того, кто авторизовался. То есть, пока не совпал логин и пароль пользователя, не запускаем session_start().

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

Если у клиента есть куки с session id, значит клиент залогинен то запускать session_start()
Если куки нет — значит не залогинен, сессию не запускаем.


Если есть куки с ID сессии, значит, вы уже вызвали session_start(), а значит, файл сессии уже создался. Проверять нунжо как-нибудь по-другому (например, совпадением введенного логина и пароля, как описано выше).
Ответ написан
dudeonthehorse
@dudeonthehorse
Email Developer
Зачем незалогиненному sid? Я не говорю об оптимизации. Просто по логике. Не надо, не запускай.
Ответ написан
Anonym
@Anonym
Программирую немного )
Я не разделяю пользователей. Для всех стартует сессия и даются права. Для анонимных — минимум прав, для авторизованных — побольше.
Ответ написан
@R0ckwi11
А сессии вообще и в БД хранить можно, рекомендую.
Даже если сейчас для незалогиненых пользователей сессия не нужна, она может понадобиться потом, так что ИМХО стоит
Ответ написан
@impass
Хочу посоветоваться, имеет ли смысл запускать сессию исключительно для залогиненых пользователей поскольку последних намного меньше?

На самом деле, так и должно быть почти всегда. Разработчки тех или иных веб-приложений так зачастую сами плохо представляют, что впустую созданная сессия до момента собственно аутентификации ни для чего не нужна. Для целей сбора какой-либо статистики посещения стоит изобретать решение, не зависящие от основной сессии: выставление куки для дополнительных субдоменов или конкретных путей сайта и т.п.
В случаях, когда, например, необходимо настроить кэширование ответов backend'а на сильно нагруженных сайтах, отключить создание сессии для каждого входящего — просто жизненно необходимо.
Ответ написан
Комментировать
stanishevsky
@stanishevsky
А совсем по-хорошему, кроме создания сессии только для залогиненных пользователей (что, вообще говоря, правильно), поставьте перед веб-сервером реверс-прокси — nginx или varnish (рекомендую последний), которые будут проверять наличие куки залогиненного пользователя, и в случае ее отсутствия выдавать контент из своего кеша. Таким образом, вы вообще не будете запускать PHP для незалогиненных пользователей.

Вот, например, как решается эта проблема в друпале (неважно, что у вас, принципы, скорее всего, те же) www.varnish-cache.org/trac/wiki/VarnishAndDrupal
Ответ написан
Комментировать
Angerslave
@Angerslave
Аутентификация лишь частный случай использования сессий. Вообще, если сессия не нужна, то и нет смысла ее стартовать. Но многие современные фреймворки делают это в целях унификации, благо стоит это действительно недорого.
Ответ написан
Комментировать
@egorinsk
Вам надо всю работу с сессиями инкапсулировать в отдельный класс. Тогда вы сможете легко менять механизмы хранения и создания сессий, не трогая остальное приложение.

Вам уже советовали хранить сессии в редисе, можно так же в БД их попробовать хранить.
Ответ написан
Комментировать
@softm
Почему бы не попробовать, идея хорошая, по-моему.
Может будет немного выигрыша по быстродействию.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы