Преимущества хранения сессий в БД

-=[KILLER]=-

Новичок
Преимущества хранения сессий в БД

Всем известно что во всех известных движках CMS и форумах, везде где есть система авторизации пользователей, сессии пользователей в той или иной форме хранятся в БД.
Объясните, зачем это делать несчитая мода who is online?
 

zerkms

TDD infected
Команда форума
"кто в онлайне" не требует хранения сессии в БД.
есть подозрения, что хранение сессионной информации в бд, а не фс - результат паранойи.
 

-=[KILLER]=-

Новичок
zerkms
Я знаю только один способ реализации "кто в онлайне":
при выполнении входа заносим в БД,
при выходе удаляем из БД,
если нет выхода удаляем из БД по таймауту.

Можно поинтересоваться про ваш вариант?

Что такое фс?

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

zerkms

TDD infected
Команда форума
Я знаю только один способ реализации "кто в онлайне":
при выполнении входа заносим в БД,
при выходе удаляем из БД,
если нет выхода удаляем из БД по таймауту.
совершенно верно, но разве это "хранение сессии в БД" ??????

если для вас разницы нет - тогда читать php.net/session_set_save_handler и по сессиям вообще

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

-=[KILLER]=-

Новичок
совершенно верно, но разве это "хранение сессии в БД" ??????
сессии пользователей в той или иной форме
Читать инструкцию конечно полезно, но если немного отойти от PHP терминологии и практики мы можем понять вопрос, ответ на который меня интересует.

Есть ли какие-нибудь преимущества в реализации этого механизма или необходтмость это делать?
 

zerkms

TDD infected
Команда форума
-=[KILLER]=-
если тебе нужно знать кто сейчас на сайте и как то управлять авторизованными пользователями - то делай именно так
если не нужно - то не делай
 

Фанат

oncle terrible
Команда форума
-=[KILLER]=-
До тебя, похоже, не доходит.
если в бд хранится некий идентификатор юзера и время его последней активности, то это не означает, что в бд хранятся сессии.
Как понял меня? приём.

"Той или иной" формы у сессий не бывает. Форма всегда одна.
Если у тебя бд служит для отслеживания количества пользователей, то это не называется "сессиями в иной форме".
 

rooot

Новичок
-=[KILLER]=-
открой браузер (стартуй сессию)
закрой браузер, сессии больше нет!

Ты путаешь сессию с who is online - это две разные вещи!
Сессия некий механизм (шестеренка в будильнике), ПХП имеет доступ к этой шестеренке но не к будильнику!

Фанат
Шеф я прав или опять идти читать man?
 

-=[KILLER]=-

Новичок
В БД можно хранить некий идентификатор юзера и время его последней активности для "кто в онлайне". Не сессии. Понятно.

А толк есть от хранения сессий в БД без некого идентификатора юзера и времени его последней активности?

Приём.
 

zerkms

TDD infected
Команда форума
-=[KILLER]=-
ты понимаешь что такое сессия? если нет - тогда почитай ссылки которые я давал ранее - там написано просто и понятно
 

-=[KILLER]=-

Новичок
zerkms
Сессия это:
Сессия некий механизм (шестеренка в будильнике).
"Той или иной" формы у сессий не бывает. Форма всегда одна.
Ты всегда отвечаешь на вопрос вопрсом?
А ты понимаешь, что такое БД?
[SQL]
CREATE TABLE `ibf_admin_sessions` (
`ID` varchar(32) NOT NULL default '',
`IP_ADDRESS` varchar(32) NOT NULL default '',
`MEMBER_NAME` varchar(32) NOT NULL default '',
`MEMBER_ID` varchar(32) NOT NULL default '',
`SESSION_KEY` varchar(32) NOT NULL default '',
`LOCATION` varchar(64) default 'index',
`LOG_IN_TIME` int(10) NOT NULL default '0',
`RUNNING_TIME` int(10) NOT NULL default '0',
PRIMARY KEY (`ID`)
) TYPE=MyISAM;
[/SQL]
 

zerkms

TDD infected
Команда форума
спасибо за консультацию, я это очень оценил, угу ;))))
но раз уж мы общаемся в контексте ЯП, то уж извольте понимать термины именно так, как они описаны создателями языка в мануале а не придумывать своё
http://www.php.net/manual/ru/features.sessions.php (и далее по ссылкам) - тут читаем что такое и зачем нужны сессии.
если то, что реализовано у тебя "пользовательские сессии" - то так и говори, либо придумай другое название, не совпадающее с другими используемыми в пхп терминами.

далее - если ты всё это время под словом "сессия" понимал именно "пользовательская сессия", которую используют для того, чтобы следить за тем, кто и где сейчас на сайте, и различного рода управления пользователями (кик, бан, ...)
т.е. ты и сам это прекрасно понимал ;)

повторюсь - если тебе нужно это реализовать - реализовывай, если не нужно - не реализовывай. делов то.

Ты всегда отвечаешь на вопрос вопрсом?
нет, не всегда.
А ты понимаешь, что такое БД?
да, ты будешь смеяться, но понимаю ;)
 

iNTa

Новичок
раз хранение сессии в БД это результат некой паранои

это получается взломать сессию которая хранится в ФС
так же трудно\легко как которая хранится в БД?

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

magic

lancer
Никакой паранойи при хранении сессий в БД нет. Нужно только понимать, когда удобно использовать тот или иной инструмент..

В основном, хранение сессий в БД используется при межсайтовой авторизации или при распределении нагрузки на несколько серверов. То есть, в том случае, когда вам нужно иметь единое место для хранения сессий.

Кроме обычного хранения сессий в БД, существует еще несколько расширений, выполняющих похожую задачу - например msession, session-pgsql или Zend Platform's Session Clustering.
 

AndreyKl

Новичок
Re: Преимущества хранения сессий в БД

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

medwoodu

Новичок
Люди, просмотрел тему, ответа лично для себя не нашел.
1) Насколько увеличивается нагрузка на SQL сервер?
2) Какие реальные преимущества кроме уменьшения кода дает работа с БД???
Личное мнение, если не прав, то поправьте:
1) При использовании файловых сессий скорость выше, так же как и просто при работе с файлами.
2) При использовании файлов структуризация и выборка данных пренадлежащих менее удобна
3) Сервер Mysql грузится дополнительно минимум на 2 запроса.
4) Сессия может быть бесконечной, даже если таймаут превышен.
 

alexei.lexx

Новичок
Даже при распределении нагрузки на несколько серверов можно спокойно хранить сессии в файловой системе. Достаточно использовать IP virtual server. И если ваш первый запрос пойдёт, скажем, на сервер №1, то будьте уверены следующие будут идти туда же. Пока конечно не истечёт таймаут, установленный на IPVS.
 

nail

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

А уже потом сравнивать, в реальных условиях.

У дисков среднее время поиска кластера ~5ms, следовательно ограничение 20 запросов в секунду.
И у файловой системы, и у субд одна из главных задач - минимизировать количество операций по доступу к диску.
Трудно сказать, кто из них окажется лучше под большой нагрузкой (когда дисковые кэши не вмещают все данные), все зависит от конкретной ситуации. Это в случае одного сервера.

Все равно, если скорость критична, то данные лучше хранить или самому в shared memory, или в различных кэшах вроде APC, EAccelerator, Memcached.

Upd: поправочка: 200 запросов в секунду, а не 20
 

medwoodu

Новичок
Upd:Imho 2: структуризация и выборка одинаковая

При реализации с бд:
1)скорость ниже;
2)возможны привязки данных и учетных записей по принцыпу сессий(т.е. бесконечное хранение данных сессии, хотя срок действия авторизации давно прошел.);
пожалуй все.
Выводы:
Плюсы:
1 Бесконечные сессии(необходимо если нужно хранить постоянно инфу о пользователе, но которая может часто меняться)
2 Удобный сервис кто здесь.
Минусы:
1 Замедление работы
2 Рост нагрузки на сервер

!Безопасность одинаковая, все зависит от прямоты рук пишущего!
 
Сверху