2013-09-23 1 views
0

Я занимаюсь разработкой сайта на PHP. Когда начинается сеанс пользователя, я загружаю всю его строку db в переменную $ _SESSION var. Когда пользователь меняет значение db, я также обновляю var $ _SESSION.Согласование пользовательских данных между всеми его сеансами

Проблема начинается, когда более одного сеанса активны для одного и того же пользователя. Есть ли способ обновить данные для всех сеансов одного и того же пользователя без перегрузки базы данных? Или, альтернативно, есть ли способ заставить php использовать один и тот же файл сеанса для всего сеанса, принадлежащего одному и тому же пользователю? Или я должен просто запрашивать db каждый раз, когда сеанс продолжается?

И еще одна дилемма: стоит ли это? Я имею в виду, я не знаю, насколько этот механизм мог бы облегчить загрузку сервера, и я не знаю, применим ли этот механизм к сеансам на основе файлов, или я должен использовать другой тип хранения сеанса.

Этот вопрос несколько связан с this other question on mine (даже если обходным путем для этого является просто удаление всех файлов сеанса).

+1

Если данные присутствуют в БД, вам не нужно передавать их через сеанс каждый раз. В сеансе требуется только зарегистрированный пользователь. Предположим, пользователь зарегистрирован, и он обновляет свой аватар или что-то еще, связанное с его user_id. Зачем вам нужно сохранять $ row ['avatar'] в $ _SESSION, когда вы можете получить к нему доступ каждый раз '' SELECT avatar FROM users WHERE user_id = $ _SESSION ['user_id'] "' –

+0

@RoyalBg Вы экономите именно ваши данные вызовите в базу данных, если вы сохраните такие данные в любом случае, прочитайте SESSION – djot

+0

точно @RoyalBg, вам нужно обновить evrything в db с помощью 'user_id', а затем, если вам нужно обновить адрес электронной почты или имя пользователя, а затем обновить его до db, а затем снова сохранить обновленный адрес электронной почты или имя пользователя на сеанс –

ответ

1

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

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

Предполагая, что пользователь может изменить свой аватар, и вы не заходите так много мест, чтобы отобразить этот аватар, вам не нужно хранить его в сеансе, а не SELECT в то же самое время. Например, у вас может быть триггерная страница, в которой SELECTS аватар $_SESSION['user_id'], когда он пытается отправить личное сообщение другому пользователю. В противном случае вы можете поместить кеш (т. Е. Использовать memcached), где запрос, который выбирает пользовательские аватары, не должен делаться чаще, чем один раз в час.

Если пользователь меняет адрес электронной почты, это то же самое. Если кто-то еще пытается отправить ему сообщение, вы вызываете запрос SELECT. В противном случае устанавливается кеш.

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

Независимо от того, сколько раз пользователь пытается установить сеанс (в этом случае журналы второй раз), у вас есть данные в db, а сеанс - только с идентификатором. Вы можете идентифицировать все его экземпляры, но никогда не использовать данные, которые не нужны.

+0

Спасибо, memcached будет идеально :) О SELECTing столбцах, не лучше загрузить всю строку пользователя один раз? –

0

1 Ну, я (не хочу, но) мог бы сделать это с помощью моего обработчика сеанса. Я использую базы данных SESSIONS с дополнительной информацией/столбцами, такими как имя пользователя и идентификатор пользователя. Таким образом, я могу точно определить, какой сеанс принадлежит тому пользователю, который не сталкивался с сериализованными данными.

http://php.net/manual/de/function.session-set-save-handler.php

2 Но в вашем случае это может быть проще, чтобы обновить таблицу пользователей, а затем выберите пользователя снова поставить (новые) данные в $ _SESSION [ «пользователя»]. (Вам понадобятся некоторые «данные пользователя были обновлены», чтобы перезагрузить новые данные для всех сеансов).

3 Или вы просто избегаете, чтобы пользователь мог войти в систему более одного раза.

+0

Повторный запрос данных каждый раз, очевидно, намного проще :), но это не проблема. Моя реальная проблема в том, что такой механизм действительно эффективен ... Я обновил свой вопрос, посмотрю «другую дилемму». –

+0

Вам действительно нужна такая функция? У меня такое чувство, что ваша «концепция» ошибочна. – djot

 Смежные вопросы

  • Нет связанных вопросов^_^