Вопрос может показаться странным, но мне интересно почему так:
Я изменил место хранения сессий
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 сессии сохраняется, куки же никто не убивал, по тому и имя файла тоже самое ![]() |
Нашёл, это пока только теория, но думаю проверить стоит. При автоизации из БД запрашивается находится ли этот пользователь уже онлайн, если да, тогда выдаётся сообщение что нужно подождать Х минут пока сессия в БД не умрёт, но когда время заканчивается, строка из БД не удаляется, и пользователь входит в старую сессию.
Спустя 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. Если пользователь уже онлайн, и кто-то ещё зная его логин и пароль пытается войти, то у него это не получится пока первый пользователь не выйдет.
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 для перевозки зубочистки