Forum Webscript.Ru
Программирование => PHP => Тема начата: SlavaK от 09 Января 2004, 13:14:27
-
Как с помощью PHP можно определить, что пользователь покинул страницу сайта (или сайт вообще)?
-
никак.
http://faq.phpclub.net/na_tanke
-
Делаешь очень просто: когда пользователь ходит по сайту открываешь сессию и время. Записываешь все это дело в БД или в файл. Например если ты с MySQL сделал. Пока пользователь ходит по сайту обновляешь время по ключу - индефикатор сессии. Когда время отстает минут на 30 можно судить что пользователь ушел - в общем таким способом можно сделать скрипт "кто был на сайте".
-
На счет регистрации времени посещения страниц - это я и сам додумался. Только я решил обойтись без сессий, а просто обновлять время посещения страницы в одной из таблиц MySQL. Мне это нужно для чата. Чтобы удалять неактивных из списка присутствующий.
-
SlavaK, молодец.
делать показ "кто сейчас онлайн" с помощью сессий - это стрелять из пушек по воробьям.
Так имеет смысл только если сессии уже используются, а сессии имеет смысл использовать на весьма ограниченном количестве сайтов и весьма и весьма подумав - сколько они вреда принесут ,а сколько - пользы.
Ну, а в чате-то и вовсе просто. странно, что ты сам не догадался выкидывать всех, кто не обновил страницу за время, которое у тебя рефрешится чат, плюс небольшой таймаут.
А вот тебе и функция, кстати, я тут на соседнем форуме написал.
Правда, тут в качестве идентификатора юзера используется его IP - только заменить его на имя в чате - и всею
function online($timeout=180) {
mysql_query("DELETE FROM session WHERE time < unix_timestamp()-$timeout");
mysql_query("REPLACE session VALUES (\'".getenv("REMOTE_ADDR")."\',unix_timestamp())");
$result = mysql_query("SELECT COUNT(*) FROM session");
$count = mysql_fetch_array($result);
return $count[0];
}
Наверняка у тебя получилось сложнее
ripper, таймаут в 30 минут может поставить либо полный, клинический идиот, либо патологический лжец.
Ибо в 10 раз превысить реальное среднее время нахождения на странице, и даже умудриться перекрыть стандартное время жизни сессии, которое рассчитано на то, что человек гарантироваенно ушел с сайта - это надо быть фантастически жадным.
-
RomikChef:
mysql_query("REPLACE session VALUES (\'".getenv("REMOTE_ADDR")."\',unix_timestamp())");
Я не совсем понял.
Этот запрос что, заменяет ВСЕ записи таблицы session на значение текущего IP-адреса посетителя и на текущий таймстемп?
-
Спасибо за заготовку, RomikChef. У меня уже есть что-то подобное.
У меня при детектирповании IP-адресов мало адресов определяются реальных. Чаще всего определяются типа : 192.168.0.x
Для детектирования IP пользовался найденной на форуме заготовкой :
if (getenv("HTTP_CLIENT_IP")){$ip = getenv("HTTP_CLIENT_IP");}
elseif (getenv("HTTP_X_FORWARDED_FOR")){$ip = getenv("HTTP_X_FORWARDED_FOR");}
else {$ip = getenv("REMOTE_ADDR");}
-
FreeSpace , нет :-)
Ссылку на доку дать? ;-)
-
RomikChef
Всё, уже разобрался, спасибо :)
Пока что продолжаю осваивать мускуль и с REPLACE сталкивался всего один раз, и то поверхностно.
Зато почерпнул для себя нечто полезное, что раньше до конца не понимал:
Note that unless the table has a UNIQUE index or PRIMARY KEY, using a REPLACE command makes no sense. It becomes equivalent to INSERT, because there is no index to be used to determine whether a new row duplicates another.
SlavaK
Единственный достоверный IP-адрес, который ты можешь использовать у себя в скриптах - это REMOTE_ADDR.
Всё остальное можно элементарно подделать. Представь себе, что клиент, соединится с твоим сервером напрямую и отправит ему заголовок HTTP_X_FORWARDED_FOR со значением случайно сгенерированного IP-адреса. В таком случае сервер никак не отличит такого клиента от прокси-сервера и запомнит именно тот поддельный адрес, который сгенерирует клиент.
Надеюсь я достаточно внятно объяснил.
-
FreeSpace
Спасибо, буду иметь в виду.