[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Вопросы по сессиям
McLotos
Добрый день.
Вопрос может показаться странным, но мне интересно почему так:
Я изменил место хранения сессий
ini_set('session.save_path', $_SERVER['DOCUMENT_ROOT'].'/system/sessions/');

Теперь возникает непонятная мне ситуация, когда пользователь заходит на сайт, в папке system/sessions появляется файл sess_{$id_session} это нормально.

1.почему в папке tmp, куда раньше сохранялись сессии создаётся ещё 1 файл с другим именем?

Дальше какой-то бред:
Я хочу убить сессию пользователя, для этого посылаю команду серверу уничтожить файл в моей директории
$_SERVER['DOCUMENT_ROOT'].'/system/sessions/

я не трогаю папку tmp. После удаления этого файла пользователя выкидывает (Так и планируется), но
2.почему когда он снова авторизуется ему возвращается тот же самый id сессии?
3.Почему файл восстанавливается, а не создаётся новый?
4.И почему в папке tmp всё-равно появляются файлы?


В БД есть таблица, которая хранит в себе данные о сессиях.
`id_session` tinytext COLLATE utf8_unicode_ci NOT NULL,
`putdate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`user` tinytext COLLATE utf8_unicode_ci NOT NULL,
`page` text COLLATE utf8_unicode_ci NOT NULL

А работа с этой таблицей выполняется скриптом
$query = "SELECT * FROM ".$db_Sessions." 
WHERE id_session = '
$id_session'";
$ses = mysql_query($query);
if(!$ses) exit("Ошибка в запросе к таблице сессий");
if(mysql_num_rows($ses)>0)
{
$query = "UPDATE ".$db_Sessions." SET putdate = NOW(),
user = '
$_SESSION[SN]', page='$_SESSION[page]'
WHERE id_session = '
$id_session'";
mysql_query($query);
}
else
{
$query = "INSERT INTO ".$db_Sessions."
VALUES('
$id_session', NOW(), '$_SESSION[SN]','$_SESSION[page]')";
if(!mysql_query($query))
{
exit("Ошибка при добавлении пользователя"; );
}
}

$query = "DELETE FROM ".$db_Sessions."
WHERE putdate < NOW() - INTERVAL '20' MINUTE"
;
mysql_query($query);




Спустя 3 часа, 18 минут, 27 секунд (24.02.2012 - 10:19) killer8080 написал(а):
Цитата (McLotos @ 24.02.2012 - 06:00)
1.почему в папке tmp, куда раньше сохранялись сессии создаётся ещё 1 файл с другим именем?

потому что где то еще запускается скрипт, в котором есть session_start(), но нет ini_set()
Вообще такие вещи нужно прописывать глобально, либо в php.ini, если есть доступ, или в .htaccsess (если апач конечно)
php_value session.save_path /path/to/tmp

Цитата (McLotos @ 24.02.2012 - 06:00)
3.Почему файл восстанавливается, а не создаётся новый?

файл не восстанавливается, просто id сессии сохраняется, куки же никто не убивал, по тому и имя файла тоже самое ;)

Цитата (McLotos @ 24.02.2012 - 06:00)
Я хочу убить сессию пользователя, для этого посылаю команду серверу уничтожить файл в моей директории

вообще нужно было просто вызвать session_destroy()

Спустя 6 минут, 53 секунды (24.02.2012 - 10:26) McLotos написал(а):
По первым двум пунктам будем искать и разбираться, спасибо за подсказку.
Цитата
файл не восстанавливается, просто id сессии сохраняется, куки же никто не убивал, по тому и имя файла тоже самое wink.gif

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

Спустя 7 минут, 20 секунд (24.02.2012 - 10:33) killer8080 написал(а):
Цитата (McLotos @ 24.02.2012 - 09:26)
Нашёл, это пока только теория, но думаю проверить стоит. При автоизации из БД запрашивается находится ли этот пользователь уже онлайн, если да, тогда выдаётся сообщение что нужно подождать Х минут пока сессия в БД не умрёт, но когда время заканчивается, строка из БД не удаляется, и пользователь входит в старую сессию.

А зачем это все? Ненужно убивать сессию, просто выставляешь флаг если авторизован.

Спустя 3 минуты, 9 секунд (24.02.2012 - 10:36) McLotos написал(а):
1. Я могу узнать кто сейчас онлайн всего одним запросом, при этом сразу же получу ещё и адрес страницы, где сейчас этот юзер.
2. В случае если мне что-то не понравится я могу выкинуть пользователя из сайта одним кликом.
3. Если пользователь уже онлайн, и кто-то ещё зная его логин и пароль пытается войти, то у него это не получится пока первый пользователь не выйдет.

Спустя 4 минуты, 31 секунда (24.02.2012 - 10:41) killer8080 написал(а):
Цитата (McLotos @ 24.02.2012 - 09:36)
3. Если пользователь уже онлайн, и кто-то ещё зная его логин и пароль пытается войти, то у него это не получится пока первый пользователь не выйдет.

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

Спустя 2 минуты, 26 секунд (24.02.2012 - 10:43) McLotos написал(а):
Цитата
К тому же, если юзер забудет разлогиниться, то не сможет зайти с другого компа.

Сможет, но только после 20 минут бездействия. Через 20 минут происходит следующее. Сессия умерает, файл сессии удаляется, в БД посылается запрос
DELETE FROM ".$db_Sessions."
WHERE putdate < NOW() - INTERVAL '20' MINUTE";


_____________
программирование - инструмент для решения конкретных задач, любая попытка спроектировать что-то универсальное приведет к провалу.©paul85
В любом случае тебе прийдётся пройти путь изобретения велосипеда, который прошли другие, только причиной твоего изобретения будет непонимание принципов работы велосипеда изобретённого другими людьми.©SlavaFr
jQuery это попытка использовать АН-225 для перевозки зубочистки
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.