Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Обработчик закрытия окна (https://javascript.ru/forum/misc/6631-obrabotchik-zakrytiya-okna.html)

nark03 10.12.2009 16:29

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

Gvozd 10.12.2009 17:41

кроссбраузерно никак

B~Vladi 10.12.2009 18:12

Делают так: запоминают последний запрос к серверу. Погрешность не большая.

nark03 10.12.2009 22:12

Цитата:

Сообщение от B~Vladi (Сообщение 37627)
Делают так: запоминают последний запрос к серверу. Погрешность не большая.

Обьясните по подробнее пожалуста, можна ли это реализовать без серверной части?

B~Vladi 10.12.2009 22:55

Цитата:

Сообщение от nark03
можна ли это реализовать без серверной части?

Цитата:

Сообщение от nark03
когда пользователь закрывал страницу в базу даных передавалось время выхода с страницы

В каких тогда базах собираетесь хранить?! В локальных?:)

nark03 10.12.2009 23:20

Не правильно выразился)) Хотел сказать можна ли это реализовать со стороны клиента, если нет то можна ли както чтоб на сервере скрипт выполнялся автоматически без обращения к нему? Например с заданым периодом проверяло есть ли юзер сейчас на сайте. Допустим создам таблицу в которую со стороны клиента будет отсылатся через 5 секунд что он онлайн. А на сервере чтоб выполнялась проверка автоматом по базе, если юзера например нету больше чем 20 секунд то удалить с таблицы. Может все что я пишу есть бред, так и скажите не обижусь, ибо новичок.

B~Vladi 10.12.2009 23:33

Цитата:

Сообщение от nark03
можна ли както чтоб на сервере скрипт выполнялся автоматически без обращения к нему?

На эту тему можно почитать здесь:
http://javascript.ru/ajax/server-push
Цитата:

Сообщение от nark03
со стороны клиента будет отсылатся через 5 секунд что он онлайн

Опять же ты себе противоречишь. Откуда слать запросы? С сесвера или с клиента?!
Если второе - http://javascript.ru/tutorial/ajax

micscr 11.12.2009 09:48

Интересно как с сервера слать запросы клиенту?
Никогда о таком не слышал, в php например. Это нужно же постоянное соединение. Может Java?
Цитата:

можна ли как то чтоб на сервере скрипт выполнялся автоматически без обращения к нему?
cron

Вообще каждые 5 сек. слать аякс запрос на сервер - жестоко для сервера по моему.
Лучше как Влади и говорил:
1) Зашел наш пользователь - запомнилось в табличке Х его время захода.
2) Зашел любой пользователь - табличка Х проверилась и все что старше 20 сек удалилось или как покинутое обозначилось - вот и нет пользователя online. И cron не нужен.

nark03 11.12.2009 11:05

Просто я пишу чат на Flash. Задача моя состоит в том чтобы выводились все пользователи онлайн, по таймеру через каждые 10 секунд отсылает Flash запросы PHP, тот проверяет базу, и выводит всех кто сейчас онлайн. Но если человек вышел, то информация собственно не удаляется, можна конешно повесить на флеш кнопку выход, но не факт что все будут ей пользоватся, по этому нужно какоето решение. Если вопрос не сюда извените)).

Gvozd 11.12.2009 12:38

блин
типа так не судьба сделать?
DELETE FROM users WHERE last_time<TIME()-20

nark03 11.12.2009 13:11

Цитата:

Сообщение от Gvozd (Сообщение 37690)
блин
типа так не судьба сделать?
DELETE FROM users WHERE last_time<TIME()-20

Просто если каждый клиент будет проверять активность остальных не велика ли это нагрузка?

Gvozd 11.12.2009 13:53

Цитата:

Сообщение от nark03
Просто если каждый клиент будет проверять активность остальных не велика ли это нагрузка?

если правильно все сделать, то все будет пучком
по-крайней мере пока вы не собиретесь написать вконтакт-2
а)вам надо для колонки с последним моментом активности юзера в БД сделать индекс. Тогда операция удаления неактивных пользователей будет достаточно быстра
запрос можно оптимизировать до
DELETE FROM active_users ORDER BY last_time WHERE last_time<TIME()-20 LIMIT 1
также можно использовать какой-нибудь семафор(например файл), или запускать удаление по cron-у, и тем самым наверняка ограничть количество запросов на удаление, без потери результата

nark03 11.12.2009 14:28

Спасибо, будем пробовать

subzey 12.12.2009 18:39

Цитата:

Сообщение от Gvozd (Сообщение 37697)
также можно использовать какой-нибудь семафор(например файл), или запускать удаление по cron-у, и тем самым наверняка ограничть количество запросов на удаление, без потери результата

А можно пойти по стопам Зива и Энди, и при каждом обращении (после выдачи результата) с вероятностью, скажем, 5%, удалять старые записи. А с вероятностью 1% делать OPTIMIZE TABLE.

Ну, как вариант исключительно :)

Gvozd 12.12.2009 18:55

Цитата:

Сообщение от subzey
Зива и Энди

кто такие?

subzey 12.12.2009 19:10

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

micscr 12.12.2009 19:43

В MySql команда DELETE физически данные не удаляет, а только помечает на удаление. Не вижу проблем со скоростью особенно при выборке на индексе.
Удаляет физически - OPTIMIZE TABLE, ну и новые INSERT пишут свои данные поверх помеченных на удаление.
Так что с 1% Зив и Энди как всегда рулят.


Часовой пояс GMT +3, время: 22:27.