Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Как проверить существование сессии?
 
 автор: Anwor   (12.05.2006 в 20:39)   письмо автору
 
 

Как с помощью имеющегося значения константы SID проверить существование сессии? Подскажите функцию.

   
 
 автор: Саня   (12.05.2006 в 22:57)   письмо автору
 
   для: Anwor   (12.05.2006 в 20:39)
 

Сравнить имеющееся значение со значением, которое даёт функция session_id().

   
 
 автор: Anwor   (12.05.2006 в 23:09)   письмо автору
 
   для: Саня   (12.05.2006 в 22:57)
 

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

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

Может, у кого-то есть более гибкие наработки по этой теме?

Если слишком сумбурно, то разложу по пунктам:
1. Юзер заходит - на него заводится новая запись в таблиц о сессиях. Туда же кидается время входа и его SID.
2. Юзер выходит - предположим, некорректно, прямо по рубильнику... вариант с явовским onUnload отпадает.
3. Отдельный скрипт, работающий в фоновом режиме, проверяет по базе (а именно - по существующим записям SID) существование соответствующих сессий, и если какой-то из них уже НЕ существует, в таблицу встает дата выхода, а запись SID удаляется. Т.о. получаем, что существуют в данный момент только те сессии, SIDы которых есть в таблице. По ним и ведется проверка.

   
 
 автор: Саня   (12.05.2006 в 23:15)   письмо автору
 
   для: Anwor   (12.05.2006 в 23:09)
 

Я бы сделал так:
В базе добавил поле - время последнего изменения. Написал юзер в чате, обновил страницу... - поле приняло значение time(). А затем кроном удалять все записи, время изменения которых больше чем time()+3*60.

   
 
 автор: Anwor   (12.05.2006 в 23:29)   письмо автору
 
   для: Саня   (12.05.2006 в 23:15)
 

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

   
 
 автор: Trianon   (13.05.2006 в 00:46)   письмо автору
 
   для: Anwor   (12.05.2006 в 23:09)
 

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

   
 
 автор: Anwor   (16.05.2006 в 20:14)   письмо автору
 
   для: Trianon   (13.05.2006 в 00:46)
 

Нет, все-таки превалирующим остается вариант выхода по крестику на окне explorer'a (или др. браузера), т.е. допустим вариант onUnload.... Но как же в данной ситуации избежать тотального краха программы, предусмотрев другие, некорректные варианты выхода? Может, кто-то поделится идеей?..

   
 
 автор: Саня   (16.05.2006 в 20:29)   письмо автору
 
   для: Anwor   (16.05.2006 в 20:14)
 

Для чата, например, нужно поставить время жизни сессии 3 минуты. Если прошло три минуты с момента последнего обращения пользователя, то считать сессию недействительной и удалить её, а в канал чата вывести, что пользователь вышел.

   
 
 автор: Anwor   (16.05.2006 в 23:01)   письмо автору
 
   для: Саня   (16.05.2006 в 20:29)
 

Об этом я думал. Только как осуществить передачу информации о "смерти" сессии - скрипту, который занесет соответствующие данные в БД? В принципе, как я понял тут можно вообще обойтись без SID'а, я прав?

   
 
 автор: XPraptor   (17.05.2006 в 03:02)   письмо автору
 
   для: Anwor   (16.05.2006 в 23:01)
 

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

Самым верным способом будет AJAX можно конечно и на выключенный яваскрипт наскочить, и гневную ноту схлопатать за постоянный трафик от юзера, но зато гарантия выхода 100%.

В каждой странице пишешь ajax-овский код, который отправляет запрос на твой хост каждую минуту, а хост убеждается, что юзер не спит. А на сервере происходит проверка, если больше минуты нет запроса от скрипта, то пиши в БД о выходе юзера.

   
 
 автор: Anwor   (17.05.2006 в 14:45)   письмо автору
 
   для: XPraptor   (17.05.2006 в 03:02)
 

Честно говоря, довольно смутно представляю себе машину Аякса... Чтобы коды на нем работали, нужно ли, чтобы соответствующий движок стоял на сервере? Потому что если нужен, то здесь пролет - в дескриптинге сервиса есть только крон и еще пара никому не нужных утилиток..
А насчет точности определения выхода - можно считать исключением некорректные сбросы, а сама точность округляется минут до 3-х. Это возможно?

   
 
 автор: Anwor   (17.05.2006 в 22:40)   письмо автору
 
   для: Anwor   (17.05.2006 в 14:45)
 

Люди, горю! (((

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования