Как лучше всего обращаться с сеансами, когда пользователь может оставаться в системе, но ключ сеанса должен быть обновлен из-за другого обновления? - PullRequest
1 голос
/ 20 марта 2009

Я работаю на сайте, где технически пользователи могут оставаться в системе навсегда, если они никогда не закрывают свой браузер (и, следовательно, никогда не получают новый ключ сеанса). Вот что я могу увидеть: пользователь оставляет браузер открытым на компьютере A. Затем используйте компьютер B, войдите в систему и измените его имя, которое хранится в сеансе. Они выходят из B, но A все еще входит в систему и сохраняет старое имя в сеансе. Поэтому их имя не будет обновляться до тех пор, пока они в следующий раз не выйдут вручную или не закроют свой браузер, не откроют его снова и не войдут в систему с помощью функции запомнить меня.

Имя - простой пример, но в моем случае уровень подписки их учетной записи сохраняется в сеансе и может быть изменен.

Как вы справляетесь с этим?

Вот несколько идей, которые у меня есть:

  1. Через 10 или более минут данные сеанса перезагружаются. Это может быть ровно 10 минут, если пользователь очень активен, так как функция будет срабатывать прямо в 10-минутный момент, или это может быть через 2 часа, если пользователь уходит и возвращается, а затем вызывает функциональность.

  2. Храните как можно меньше информации в сеансе и загружайте оставшуюся часть из БД при каждом вызове страницы. (Мне действительно не нравится эта идея.)

  3. Использовать сеансы базы данных и использовать один и тот же сеанс на всех компьютерах. Мне это нравится, но я могу видеть, что это сбивает с толку, когда что-то вроде критериев поиска сохраняется в сеансе - одинаковые критерии будут отображаться в обоих браузерах / компьютерах.

  4. Для информации, даже такой как имя пользователя или имя пользователя / адрес электронной почты, сохраните ее в сеансе, но для другой информации, которая может сильно повлиять на их возможности на сайте, не сохраняйте ее в сеансе и загрузить при необходимости (попытаться сделать это только один раз за экземпляр).

Есть ли другие лучшие методы?

- Другой вариант: 5. Использовать сеанс базы данных и, когда выполняется обновление, загружать другие сеансы пользователя (просто десериализовать), изменять соответствующую информацию и сохранять их обратно в базу данных.

Ответы [ 4 ]

1 голос
/ 21 марта 2009

Я бы выбрал вариант 6: хранить только идентификатор пользователя и материал, относящийся к сеансу (критерии поиска), в своем сеансе и помещать остальное в APC / xcache (memcached, если вы используете несколько серверов).

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

1 голос
/ 20 марта 2009

Я бы выбрал либо номер 1, либо номер 4. Если вы сохраняете время последнего обновления информации, вы можете даже при каждом запросе спрашивать, была ли дата обновлена.

1 голос
/ 20 марта 2009

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

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

Привет

1 голос
/ 20 марта 2009

Обычно вы должны сделать 2), но вам это не нравится. Может быть, вы можете использовать сеансы, хранящиеся в БД. когда пользователь меняет свое имя, вставляйте во все сеансы этого пользователя информацию «обновить пользовательские данные». при следующем запросе пользовательские данные снова загружаются в сеанс и кешируются там. это можно сделать, повторно используя функцию loaduserdata, которая вызывается при входе в систему.

php session_set_save_handler() - также читайте комментарии

php session_decode() - чтобы прочитать имя пользователя из сеанса, чтобы сохранить его дополнительно к данным сеанса. полезно, чтобы легко находить сессии пользователей для обновления.

[править] не забывай: когда вы обновляете все сеансы во время генерации страницы (между session_start и session_write_close), вы можете измениться.

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