| Автор
| Сообщение |
 Kate
Постоянный участник

Возраст: 27
Знак зодиака: 
Зарегистрирован: 04.06.2007
Сообщения: 149
|
|
|
Цитата |
|
Есть на сайте авторизация хранящаяся в сессии. Есть необходимость отображать в реальном времени всех залогинившихся пользователей, к примеру, посредством изменения булевного поля состояния (true=активен, false=неактивен) в таблице, хранящей данные о пользователях. Элементарно - при ЛОГИНЕ - изменять вышеуказанное поле в соответстующей записи таблицы на TRUE, а при ЛОГАУТЕ - на FALSE. Никаких вопросов когда ЛОГАУТ происходит по ссылке к примеру.
ВОПРОС. Но как сделать вышеописанную обработку логаута (изменять таблицу пользователей) при закрытии окна броузера? Ведь в PHP же нет обработчика события типа onClose или хотя бы onUnload.  |
|
| В начало |
|
 |
|
|
 |
 NikotiN
Розовый мамонт

Возраст: 26
Знак зодиака: 
Зарегистрирован: 18.03.2005
Сообщения: 2137
|
|
|
Цитата |
|
проверять активность, если он, допустим, за 10 мин не подал признаков жизни, то усё, значит вышел _________________ Сила дурака в том, что умный перед ним бессилен. |
|
| В начало |
|
 |
 Kate
Постоянный участник

Возраст: 27
Знак зодиака: 
Зарегистрирован: 04.06.2007
Сообщения: 149
|
|
|
Цитата |
|
NikotiN,
как человеку подать признаки жизни? Я например это решила делать, как указано выше, изменением поля state (состояние активности) в таблице users на TRUE - когда он активный (мгновенно когда логинится), и на FALSE - когда делает ЛОГАУТ, либо при закрытии страницы (также мгновенно). С изменением на TRUE поля state разумеется не проблем, также как с изменением на FALSE, но только при "ручном" ЛОГАУТЕ (нажатии на ссылку). А как сделать чтобы изменялось вышеуказанное поле при ЗАКРЫТИИ браузера?
У тебя есть какие-то другие предложения как подать признаки жизни? Я так поняла в фоновом режиме?  |
|
| В начало |
|
 |
 NikotiN
Розовый мамонт

Возраст: 26
Знак зодиака: 
Зарегистрирован: 18.03.2005
Сообщения: 2137
|
|
|
Цитата |
|
всмысле, он что-то сделал, типа зашёл куда-то, нажал на ссылку и т.п. - ты обновляешь запись в бд (например возвращяешь счётчик на 10000 = 10мин).
в то же время, у тебя происходит обновление таблицы путём вычитания 1 каждую секунду (ну это для примера, а то не правильно)))) )
как только у кого-то счётчик равен 0, то значит он 10 мин ничего не делал, делаем ему логаут _________________ Сила дурака в том, что умный перед ним бессилен. |
|
| В начало |
|
 |
 Kate
Постоянный участник

Возраст: 27
Знак зодиака: 
Зарегистрирован: 04.06.2007
Сообщения: 149
|
|
|
Цитата |
|
Т.е. в каждой странице и скрипте разместить запрос к БД такого рода: UPDATE USERS SET timer=10000 WHERE userid=[ID юзера] - что будет означать залезание пользователя на страницу, а значит и присутствие его на сайте. ОК, с этим понятно.
Тогда еще вопрос - как сказать СУБД (у меня сейчас MySQL) чтобы она изменяла поля ("вычитала 1 каждую секунду") через определенный интервал времени? (вроде триггер надо написать? а в нем же только 3 события - изменение, добавление и удаление, если я не ошибаюсь, в MySQL) |
|
| В начало |
|
 |
 NikotiN
Розовый мамонт

Возраст: 26
Знак зодиака: 
Зарегистрирован: 18.03.2005
Сообщения: 2137
|
|
|
Цитата |
|
мммм, может не выставлять таймер на 10000, а записывать время последнего действия.
а при обновлении статистики сравнивать текущее время с временем последнего действия пользователя =)
я просто в бд не особо разбираюсь, так что не могу сказать как там сделать таймер или нечто подобное) _________________ Сила дурака в том, что умный перед ним бессилен. |
|
| В начало |
|
 |
DrPass
Знающий :) /Почетный Модератор/

Возраст: 31
Знак зодиака: 
Зарегистрирован: 02.05.2002
Сообщения: 5709
Откуда: Донецк
|
|
|
Цитата |
|
| Цитата: | | Тогда еще вопрос - как сказать СУБД (у меня сейчас MySQL) чтобы она изменяла поля ("вычитала 1 каждую секунду") через определенный интервал времени? |
Никак не надо. Просто храни в таблице не какие-то там счетчики, а время последней активности пользователя. В запросе "показать активных пользователей" достаточно будет выгрести список пользователей, время активности которых отличается от текущего на установленный тобой интервал.
Понятия "логаут" в веб-приложениях не существует. Т.к. нет понятия "сеанс работы" - при выполнении любой операции клиент выполняет коннект, забирает результат и делает дисконнект от сервера. Все. Сервер понятия не имеет, что там клиент делает у себя после дисконнекта. _________________ Да пребудет с вами Сила! |
|
| В начало |
|
 |
 Kate
Постоянный участник

Возраст: 27
Знак зодиака: 
Зарегистрирован: 04.06.2007
Сообщения: 149
|
|
|
Цитата |
|
дадада - точно! голова тяжелая сегодня - не догадалась сразу, разумеется так можно. Спасибо за напоминание NikotiN и DrPass =)
но тем не менее, вопрос остается открытым - есть ли возможность в MySQL изменять поле через опр. интервал времени? Вопрос ради интереса.
Также еще один открытый вопрос, поставленный в начале темы, есть ли возможность все таки изменять поле именно при ЗАКРЫТИИ браузера? Ведь все же есть смысл видеть пользователя как авторизированного даже если он ничего не делает на сайте хоть час и больше, но не закрыл его. |
|
| В начало |
|
 |
DrPass
Знающий :) /Почетный Модератор/

Возраст: 31
Знак зодиака: 
Зарегистрирован: 02.05.2002
Сообщения: 5709
Откуда: Донецк
|
|
|
Цитата |
|
to Kate
| Цитата: | | есть ли возможность в MySQL изменять поле через опр. интервал времени? |
Нет, как и в любой другой СУБД. Это должна быть внешняя программа, или сервис какой-нибудь, который обновляет таблицы.
| Цитата: | | есть ли возможность все таки изменять поле именно при ЗАКРЫТИИ браузера? |
Ты, когда по порносайтам ходила, обратила внимание, что после закрытия окна с одним сайтом открывается еще два-три новых окна с порносайтами?
Вот можно применить ту же методику. На OnCloseWindow (или как там то событие называется) запускать новую сессию, дергать с ее помощью какую-то URL, отмечающую логаут, и тут же закрывать броузер, т.к. это ж не порносайт какой-нибудь
Добавлено спустя 1 минуту 48 секунд:
P.S. Если у юзера броузер умеет блокировать всплывающие окна, это работать не будет _________________ Да пребудет с вами Сила! |
|
| В начало |
|
 |
|
|
 |
 aka57
Я живу тут....

Возраст: 28
Знак зодиака: 
Зарегистрирован: 03.07.2003
Сообщения: 1287
|
|
|
Цитата |
|
| Цитата: | | Если у юзера броузер умеет блокировать всплывающие окна, это работать не будет |
Другими словами, это не выход - бо все современные браузеры блокируют окна всплывающие по-умолчанию.
Большинство пользователей так и шастает с включенной блокировкой[/quote] |
|
| В начало |
|
 |
DrPass
Знающий :) /Почетный Модератор/

Возраст: 31
Знак зодиака: 
Зарегистрирован: 02.05.2002
Сообщения: 5709
Откуда: Донецк
|
|
|
Цитата |
|
| aka57 писал(а): |
Другими словами, это не выход - бо все современные браузеры блокируют окна всплывающие по-умолчанию.
Большинство пользователей так и шастает с включенной блокировкой |
Смотря для чего пишется. Если софтинка предполагается для корпоративной сети, то там пользователи будут шастать так, как им скажет руководство _________________ Да пребудет с вами Сила! |
|
| В начало |
|
 |
 aka57
Я живу тут....

Возраст: 28
Знак зодиака: 
Зарегистрирован: 03.07.2003
Сообщения: 1287
|
|
|
Цитата |
|
to DrPass
Даже как админ настроит  |
|
| В начало |
|
 |
 Kate
Постоянный участник

Возраст: 27
Знак зодиака: 
Зарегистрирован: 04.06.2007
Сообщения: 149
|
|
|
Цитата |
|
Dr.Pass,
В браузере есть похожее событие только onUnload, но оно будет вызываться не только когда пользователь будет закрывать окно, но и переходить в этом же окне на другую страницу. Если даже допустить такой "порноглюк" (т.к. ни то ни се, ни всплытия попапа (т.к. он сразу закрывается, мелькнув перед глазами), ни нормального закрытия), то если он будет появляться при каждом переходе на страницы - это уже перебор  |
|
| В начало |
|
 |
 aka57
Я живу тут....

Возраст: 28
Знак зодиака: 
Зарегистрирован: 03.07.2003
Сообщения: 1287
|
|
|
Цитата |
|
Тут надо думать в терминах web:
- каждая страничка грузится в рамках новой сессии
- хранение сессий - чисто фича; тут лучше по таймауту ее грохать
- если надо такую фичу как поддержание сессии пока он открыт в браузере,
то никто не запрещает через JavaScript пинговать сайт |
|
| В начало |
|
 |
|