WebScript.Ru
C:\   главная  ::   о сайте  ::  каталог скриптов  ::  гнездо  ::  форум  ::   авторам  :: Новостройки ::   ХОСТИНГ  ::

|| разделы::
|| поиск по сайту::

|| реклама::
|| новости почтой::
Рассылки Subscribe.Ru ::



Новости сайта WebScript.Ru
Популярные статьи

Hot 5 Stories

|| рекомендуем::




Сколько человек на сайте ?


Прислал: Eugene Atamanov [ 26.01.2002 @ 12:10 ]
Раздел:: [ Статьи по PHP ]


Наверное многие из вас видели такую модную фишку как "Сейчас на сайте 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
 :::::  Vladimir пишет 02.12.2002 @ 11:05 
У кото-то усть сведения, о процентном соотношении доступности 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();
?>
Для тех кто мозгами шевелить не умеет :)
 :::::  [dark]stormik пишет 02.04.2007 @ 11:33 
Можно решить эту проблему таким способом:
Для каждого нового пользователя генерить уникальный номер и запоминать его, например, в куки и сохранять в базе. Если уже в куках есть этот номер, просто обновить в базе поле последнего входа. Через определенные промежутки времени удалять из базы номера, которые давно ничего не делают или неправильно вышли. (мона использовать 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 
Спасибо, все работает. Давно хотел сделать да все некогда :)
 :::::  Александр пишет 21.03.2010 @ 12:30 
Спасибо за скрипт, установил, немного преобразовал, но основные функции ваши!
Автар молодэс )
 :::::  Владимир пишет 20.04.2010 @ 21:25 
Спасибо автору и Sahdow!
 :::::  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 даже Евгений Попов взял для своего урок, и даже прям с этого
сайта в самом уроке скопировал ))
 :::::  саня-sanja пишет 07.07.2011 @ 16:08 
супер! Реально работает!
я поставил код скрипта от пользователя Sahdow. Работает как часы!
Спасибо!!!
да кстати Евгений Попов использовал его в уроке по созданию блога.
 :::::  Дмитрий пишет 21.12.2011 @ 19:56 
Ребята, не поверите! я тоже видел этот урок у Евгения Попова.
 :::::  Akhmad пишет 28.04.2020 @ 16:47 
Случайно попал на эту страницу. жаль что скрипт не работает, устарел для PHP 7 и выдаёт ошибку.
Кто знает как писать для PHP 7. С уважением к Вам Ахмад.
Имя:
Email:
URL

Введите сумму двух чисел девять и шесть (девять+шесть=?)
Запомнить мою информацию

* Html запрещен* Ваш E-mail опубликован не будет.

Copyright © 2000-2001 WebScript.Ru nas@webscript.ru
Design © 2001 by Parallax Design Studio (aka Spectator.ru)
Все торговые марки и авторские права на эту страницу принадлежат их соответствующим владельцам.
Сгенерировано за: 0.0536060