|| разделы:: | |
|| поиск по сайту:: | |
|| реклама:: | |
|| новости почтой:: | |
Популярные статьи |
|
Hot 5 Stories |
|
|| рекомендуем:: |
|
| |
Сколько человек на сайте ?
Наверное многие из вас видели такую модную фишку как "Сейчас на сайте 126
человек, из них в чате 89". Если нет, то поставить счетчик от SpyLog вы можете
легко увидеть сколько человек находится на вашем сайте.
Вот и я решил сам реализовать такую функцию у себя на сайте //ancient.dax.ru
и вот к чему пришел...
Протокол HTTP в принципе не позволяет определить количество посетителей одновременно
находящихся на сайте. Почему это так я объяснять не хочу, но можете мне поверить
на слово. Следовательно приходится придумывать какой-то искусственный метод.
Первое что нам понадобится это база данных (в моем случае это MySQL). В этой
БД нам нужна таблица с двумя полями username и time
CREATE TABLE session (
username varchar(25) DEFAULT '' NOT NULL,
time varchar(14) DEFAULT '' NOT NULL
);
Далее приступим к написанию самого скрипта, вернее одной единственной функции.
Итак,
function online() {
$username = getenv("REMOTE_ADDR");
$past = time()-900;
mysql_query("DELETE FROM session WHERE time < $past");
$result = mysql_query("SELECT time FROM session WHERE username='$username'");
$ctime = time();
if ($row = mysql_fetch_array($result)) {
mysql_query("UPDATE session SET username='$username', time='$ctime' WHERE
username='$username'");
} else {
mysql_query("INSERT INTO session (username, time) VALUES ('$username',
'$ctime')");
}
$result = mysql_query("SELECT COUNT(*) FROM session");
$count = mysql_fetch_array($result);
echo $count[0];
}
Алгоритм очень прост. Идентифицируем каждого пользователя и заносим время его
прихода на страницу. Определяем время, через которое пользователь будет считаться
покинувшим сайт. Вот и все.
Теперь пояснения по коду. Первым делом мы получаем адрес удаленного пользователя
(REMOTE_ADDR) и определяем время, через которое будем считать пользователя покинувшим
сайт.
mysql_query("DELETE FROM session WHERE time < $past");
Этой строкой удалем все просроченные записи.
$result = mysql_query("SELECT time FROM session WHERE username='$username'");
Выбираем из БД поля, для которых REMOTE_ADDR пользователя совпадает с уже
зафиксированным.
if ($row = mysql_fetch_array($result)) {
mysql_query("UPDATE session SET username='$username', time='$ctime' WHERE
username='$username'");
} else {
mysql_query("INSERT INTO session (username, time) VALUES ('$username',
'$ctime')");
}
Если такие записи в таблице есть, то обновляем, заносим новое время захода
на страницу, если нет - добавляем новую запись.
$result = mysql_query("SELECT COUNT(*) FROM session");
$count = mysql_fetch_array($result);
echo $count[0];
Считаем из базы количество записей - это и будет количество поситителей на
сайте.
Это все.
Ancient.
Каталог веб-мастера (статьи, готовые скрипты)
//ancient.dax.ru
|
::::: alan пишет 27.01.2002 @ 16:33 | |
::::: Misha пишет 27.01.2002 @ 18:22 | |
Я бы сессии использовал, а для подсчета кол-ва человек, подсчитал бы просто кол-во файлов...(где инфа о сессиях запсывается...)
|
::::: Anton пишет 28.01.2002 @ 14:52 | |
mysql_query("UPDATE session SET username='$username', time='$ctime' WHERE username='$username'");
здесь не надо обновлять значение поля username
З.Ы. можно без баз:
можно руками файлы создавать, можно действительно через сессии
|
::::: Tankist пишет 28.01.2002 @ 17:00 | |
НЕ реально будут ошибки в определении числа юзеров!
Тут все сводится к работе с REMOTE_ADDR!!!
Но вы не подупали , что некоторые юзеры юзают прокси!!!
Надо подумать о session_start() + REMOTE_ADDR
Ждите скоро от меня статью на эту тему
|
::::: alan пишет 28.01.2002 @ 20:50 | |
А у кого-то есть такой скрипт но без баз. нет у многих возможности работать с базами. заранее сыпасибо =)
|
::::: Den26 пишет 28.01.2002 @ 23:51 | |
Ага и еще можно доавить R_A+FROM_HTTP .. и тд и тп .. чтобы идентифицировать пользователя и еще кукис ... :) Я давно так писал в чате опредление числа юзеров но не на базе а на файлах ничего работало - косячно но работало ..
|
::::: mio пишет 29.01.2002 @ 12:04 | |
а насчёт remote_addr действительно, это можно сказать грубейшая ошибка, так как многие провайдеры просто снифят 80 порт и юзер сидит под прозрачным прокси, поэтому, самым разумным способом будет использовать не remote_addr, а
REMOTE_ADDR-HTTP_X_FORWARDED_FOR
Таинственное манит ? -- http://sunfaa.rosclub.ru/
|
::::: Sahdow пишет 29.01.2002 @ 15:21 | |
А вот, если кому интересно, мой вариант, где используется и HTTP_X_FORWARDED_FOR, и REMOTE_ADDR.
Еще, на мой взгляд, мое решение немного лучше, т.к. использует функции MySQL для работы со временем.
Создаем таблицу:
CREATE TABLE online (
id INT(6) AUTO_INCREMENT UNIQUE NOT NULL,
ip CHAR(15),
time DATETIME NOT NULL,
INDEX (ip)
);
колонка id реально не нужна, но может пригодиться иногда, хотябы для того, чтобы посмотреть сколько было инсертов в таблицу :)
Сама функция:
function online () {
$ip=getenv("HTTP_X_FORWARDED_FOR");
if (empty($ip) || $ip=='unknown') { $ip=getenv("REMOTE_ADDR"); }
# уд. старые сессии
mysql_query ("DELETE FROM online WHERE UNIX_TIMESTAMP() - UNIX_TIMESTAMP(time) > 300") or die ("Can't delete old sess");
# проверка на присутстаие или занесение нового пользователя
$select = mysql_query ("SELECT ip FROM online WHERE ip='$ip'") or die ("Can't select duble");
$tmp = mysql_fetch_row ($select);
if ($ip == $tmp[0]) {
mysql_query ("UPDATE online SET time=NOW() WHERE ip='$ip'") or die ("Can't update");
} else {
mysql_query ("INSERT INTO online (ip,time) VALUES ('$ip',NOW())") or die ("Can't insert");
}
# считывание результатов
$select = mysql_query ("SELECT COUNT(*) FROM online") or die ("Can't select result");
$tmp = mysql_fetch_row ($select);
$result = $tmp[0];
return $result;
}
|
|
::::: Ancient пишет 29.01.2002 @ 22:38 | |
По сути этот вариант ни чем не отличается от первого.
|
::::: Sahdow пишет 30.01.2002 @ 13:38 | |
В общем, да.
Только здесь упор сделан на ф-ии MySQL, а у тебя всё делает PHP.
|
::::: Dimanss пишет 02.02.2002 @ 02:33 | |
Я непонил как писать этот скрипт и в какой главе? Помогите мне пожалуста. Пришлите полный скрипт и куда стовлять тоесть в какую голову. Зарание спасибо мой маил dimanss@mail.ru
|
У кото-то усть сведения, о процентном соотношении доступности HTTP_X_FORWARDED_FOR ?
|
::::: SmIlE пишет 06.03.2003 @ 20:17 | |
Для того чтобы скрипт работал нужно следующее (для тех кто не понял) :
<?
##Хост MySQL сервера (обычно localhost)
$Host="localhost";
##Имя пользователя MySQL
$User="Username";
##Пароль доступа к MySQL
$Password="Password";
##Имя базы данных
$DBName="DB";
mysql_connect ($Host, $User, $Password) or die("Fake ...");
mysql_select_db ($DBName);
unction online() {
$username = getenv("REMOTE_ADDR");
$past = time()-900;
mysql_query("DELETE FROM session WHERE time < $past");
$result = mysql_query("SELECT time FROM session WHERE username='$username'");
$ctime = time();
if ($row = mysql_fetch_array($result)) {
mysql_query("UPDATE session SET username='$username', time='$ctime' WHERE username='$username'");
} else {
mysql_query("INSERT INTO session (username, time) VALUES ('$username', '$ctime')");
}
$result = mysql_query("SELECT COUNT(*) FROM session");
$count = mysql_fetch_array($result);
echo $count[0];
}
call_user_func ('online');
mysql_close();
?>
Для тех кто мозгами шевелить не умеет :)
|
|
Можно решить эту проблему таким способом:
Для каждого нового пользователя генерить уникальный номер и запоминать его, например, в куки и сохранять в базе. Если уже в куках есть этот номер, просто обновить в базе поле последнего входа. Через определенные промежутки времени удалять из базы номера, которые давно ничего не делают или неправильно вышли. (мона использовать crontab)
|
::::: OlleG пишет 24.11.2008 @ 16:34 | |
у Меня PHP + IIS работают в режиме ISAPI, поэтому функция getenv не работает. Предлагаю добавить еще одну проверку:
if (empty($ip) || $ip=='unknown') { $ip=$_SERVER['REMOTE_ADDR']; }
|
::::: Вова пишет 11.03.2009 @ 23:07 | |
Не работаетсчетчик
Посоветуйте што делати открываю файл php пишет следуюшее ------ Can't delete old sess
хто знает оставте коментарии на етом сайте
|
::::: Женя пишет 19.06.2009 @ 09:45 | |
Вова,
1. Не определяется IP адрес. Воспользуйся этой функцией для гарантированного определения IP:
function getip() // определение реального IP-адреса
// конечно, нет способа для анонимных и сверханонимных прокси
{
// посл. перебираем переменные HTTP_CLIENT_IP, HTTP_X_FORWARDED_FOR и наконец REMOTE_ADDR
if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"),"unknown"))
$ip = getenv("HTTP_CLIENT_IP");
elseif (getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "unknown"))
$ip = getenv("HTTP_X_FORWARDED_FOR");
elseif (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown"))
$ip = getenv("REMOTE_ADDR");
elseif (!empty($_SERVER['REMOTE_ADDR']) && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown"))
$ip = $_SERVER['REMOTE_ADDR'];
return($ip);
}
2. возможна у тебя создана таблица с одним именем, а в скрипте обращаешься к другой - внимательно проверь.
|
::::: Виталий пишет 19.11.2009 @ 15:57 | |
Создал таблицу в БД, вставил код. В конце написал:echo "Человек на сайте: ".online()."";
У меня выводит на сайте:
Warning: mysql_query() [function.mysql-query]: Access denied for user 'root'@'localhost' (using password: NO) in /home/hdd1.ru/cronica/sites/www/index.php on line 120
Warning: mysql_query() [function.mysql-query]: A link to the server could not be established in /home/hdd1.ru/cronica/sites/www/index.php on line 120
Can't delete old sess
Кто нибудь знает в чём дело?
|
::::: Rusic пишет 17.02.2010 @ 13:21 | |
Спасибо, все работает. Давно хотел сделать да все некогда :)
|
Спасибо за скрипт, установил, немного преобразовал, но основные функции ваши!
Автар молодэс )
|
::::: Petro пишет 05.06.2010 @ 17:38 | |
::::: Petro пишет 10.06.2010 @ 15:16 | |
Народ помогите сделать счечик за день за месяц и тотале
и хоть шото подскажите буду благодарен......
|
::::: gh пишет 21.09.2010 @ 20:03 | |
::::: Герман пишет 04.06.2011 @ 20:26 | |
Спасибо Sahdow! Скрипт от Sahdow даже Евгений Попов взял для своего урок, и даже прям с этого
сайта в самом уроке скопировал ))
|
супер! Реально работает!
я поставил код скрипта от пользователя Sahdow. Работает как часы!
Спасибо!!!
да кстати Евгений Попов использовал его в уроке по созданию блога.
|
::::: Дмитрий пишет 21.12.2011 @ 19:56 | |
Ребята, не поверите! я тоже видел этот урок у Евгения Попова.
|
| |