Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Счетчик посетителей - что использовать?


Автор: InfMag 10.4.2005, 20:10
Мне нужно сделать счетчик посетителей мол за всю жизнь скока их тут было. Но дело в том, что я не знаю что мне проверять.
IP, Cookie или еще что...
Сразу отмечаю, что сайт проверяет наличие кук и без них отказывается работать и сообщает об этом.
Помоему это глобальная проблема, прошу ваших советов. smile

Автор: PARROT 10.4.2005, 21:29
Мой счетчик на IP. smile
Код

<?
$newip=$REMOTE_ADDR;#получаем текущий IP
$newtime=time();#получаем текущее время


$filename=date("Y-m-d");
$filename="$filename".".txt";


//Открываем файл счетчика на чтение
if(file_exists($filename))
{
$f=fopen($filename,"r");
$daycount=fread($f,filesize($filename));#считали в переменную
fclose($f);
}
$f=fopen("1.txt","r");
$u=fread($f,filesize("1.txt"));#считали в переменную
fclose($f);

//считываем файл в массив
$a=file("2.txt");
chop($str);
#в цикле проходим по массиву , разделяя каждый элемент по таб.
foreach($a as $str)
{
list($ip,$time)=explode("\t",$str);
$user[$ip]=$time;# формируем хэш
}

//Условие - если нет текущего ip в нашем хэше(значит чел еще не заходил) или время чела уже посещавшего сайт превысило час 
if (!$user[$REMOTE_ADDR]||(time()-$user[$REMOTE_ADDR])>3600)
{
$u++;

$daycount++;
$f=fopen($filename,"w+");
fwrite($f,$daycount);
fclose($f);

$f=fopen("1.txt","w");
fwrite($f,$u);
fclose($f);

$user[$newip]=$newtime;# добавляем ip и время нового чела или если старый то обновляем его время

#запиcываем хэш обратно в файл
$c=fopen("2.txt","w");
while(list($key,$value)=@each($user))
{
fwrite ($c,"$key\t$value\n");
}
fclose($c);
}
?>

Автор: PARROT 10.4.2005, 21:43
Цитата(InfMag @ 10.4.2005, 20:10)
Сразу отмечаю, что сайт проверяет наличие кук и без них отказывается работать и сообщает об этом.

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

Автор: InfMag 11.4.2005, 10:34
PARROT
Да нет. Дело в том, что куки можно использовать в счетчике каким-нить образом.
Раскажи суть твоего счетчика. Что он делает.

Автор: PARROT 11.4.2005, 10:58
Можно ставить куки посетителю на постоянку, без времени, пока мест он не сотрет куки в своем браузере.
Что мой счетчик делает?
Считает посетителей и показывает мне сколько было сегодня, по дням и за весь текущий период.

Автор: InfMag 11.4.2005, 11:05
Ну уж не знаю. Мож мне вобще счетчик не ставить... Впринцыпе там есть счетчик сколько щас сидит юзверей.

Автор: PARROT 11.4.2005, 11:15
Это личное дело каждого, мне вот например интересно узнать, сколько за день зашло народа, пора ли делать рекламу или можно еще подождать.

Автор: InfMag 11.4.2005, 11:24
PARROT
Ну так если что, то я уже передумал. smile
Все равно буду счетчик делать.
У меня еще вопросы:
  • Что из себя представляют фалйы 1.txt и 2.txt
  • Приведи пример внутренностей каждого из этих файлов
  • Как ты сообщаешь юзеру сколько у тебя посетителей сегодгя, по дням, за весь период?

Добавлено @ 11:25
И да! Я еще не врубаюсь что делает chop($str);
Добавлено @ 11:29
И я еще не понимаю как ты открываешь для чтения:


$filename=date("Y-m-d");
$filename="$filename".".txt";

...

$f=fopen($filename,"r");
$daycount=fread($f,filesize($filename));#считали в переменную
fclose($f);


$filename ведь такой еще не создан?
Добавлено @ 11:29
Хотя нет, ты же проверяешь файл на наличие.

Автор: Opik 11.4.2005, 12:48
InfMag
Код

chop($str); 

Цитата
Эта функция является псевдонимом функции rtrim().

Замечание: Действие chop() отличается от одноименной функции языка Perl, удаляющей последний символ строки.

Цитата
И я еще не понимаю как ты открываешь для чтения:

Код

if(file_exists($filename))
{
    $f=fopen($filename,"r");
}
else
{
    $f=fopen($filename,"w+"); 
}

если файл есть, читаем его, нет - создаем. (упрощенный вариант кода сверху.)

Автор: InfMag 11.4.2005, 14:31
PARROT
Вобщем за идею тебе спасибо. Вот что себе натыкал:
Код

<?php
$now_ip = get_ip();
$now_time = time();

$filename = $lb."data/counter/days/".date("d-m-Y").".dat";

if (!file_exists($filename))
{
    $fp = fopen($filename, "w+");
    fwrite($fp, "0");
    fclose($fp);
}
$fp = fopen($filename, "r");
$DayCount = fread($fp, filesize($filename));
fclose($fp);

$FileAllCount = $lb."data/counter/counter.dat";
$fp = fopen($FileAllCount, "r");
$AllCount = fread($fp, filesize($FileAllCount));
fclose($fp);

$FileUsers = $lb."data/counter/users.dat";
$users = file($FileUsers);
$u = "";
foreach($users as $u)
{
    list($ip, $time) = explode("|", $u);
    $user[$ip] = $time;
}

if (!isset($user[$now_ip]) || ($now_time - $user[$now_ip]) > 3600)
{
    $AllCount=$AllCount+1;
    $DayCount=$DayCount+1;

    $fp = fopen($FileAllCount, "w+");
    fwrite($fp, $AllCount);
    fclose($fp);

    $fp = fopen($filename, "w+");
    fwrite($fp, $DayCount);
    fclose($fp);

    $user[$now_ip] = $now_time;

    $fp = fopen($FileUsers, "w+");
    while (list($key, $value) = each($user)) fwrite($fp, "$key|$value|\n");
    fclose($fp);
}

?>

И да! Кстати. Вот тебе функция по вычислению уникального IP, через $REMOTE_ADDR он не во всех случаях виден: smile
Код

function get_ip()
{
    if ($ip = getenv("HTTP_CLIENT_IP"))
    {
        return $ip;
    }
    if ($ip = getenv("HTTP_X_FORWARDED_FOR"))
    {
        if ($ip == '' || $ip == "unknown")
        {
            $ip = getenv("REMOTE_ADDR");
        }
        return $ip;
    }
    if ($ip = getenv("REMOTE_ADDR"))
    {
        return $ip;
    }
}

Добавлено @ 14:33
Цитата

$AllCount=$AllCount+1;
$DayCount=$DayCount+1;

У меня почему-то оператор ++ тупит. Пишу $AllCount++; и $DayCount++;, а он ниче не прибавляет... Но может это только с нулем потому что.

Автор: PARROT 11.4.2005, 15:06
У меня работает smile

Это в дополнение:

Создаешь файл daycount.php и вставляешь туда этот скрипт, он тебе печатает за каждый день, сколько у тебя было чел на сайте.
Код

<?
$filename=date("Y-m-d");
$filename="$filename".".txt";


//Открываем файл счетчика на чтение
if(file_exists($filename))
{
$f=fopen($filename,"r");
$daycount=fread($f,filesize($filename));#считали в переменную
fclose($f);
}
echo "За сегодня нас посетило $daycount человек(а)";
?>

Автор: InfMag 11.4.2005, 18:35
PARROT
Кстати, я обнаружил кое-что. Твой скрипт не обновляет время юзера если он на месте и скрипт не чистит базу. Вот что я себе написал:
Код

<?php
$now_ip = get_ip();
$now_time = time();

$filename = $lb."data/counter/days/".date("d-m-Y").".dat";

if (!file_exists($filename))
{
    $fp = fopen($filename, "w+");
    fwrite($fp, "0");
    fclose($fp);
}
$fp = fopen($filename, "r");
$DayCount = fread($fp, filesize($filename));
fclose($fp);

$FileAllCount = $lb."data/counter/counter.dat";
$fp = fopen($FileAllCount, "r");
$AllCount = fread($fp, filesize($FileAllCount));
fclose($fp);

$FileUsers = $lb."data/counter/users.dat";
$users = file($FileUsers);

for ($i=0; $i<sizeof($users); $i++)
{
    $_users = explode("|", $users[$i]);
    if (($now_time - $_users[1]) > 3600)
    {
        $change = 1;
        $changes[$i] = "";
    } else {
        $changes[$i] = $users[$i];
    }
}
if (isset($change))
{
    $fp = fopen($FileUsers, "w+");
    for ($i=0; $i<sizeof($users); $i++)
    {
        fwrite($fp, $changes[$i]);
    }
    fclose($fp);
    unset($change);
    unset($changes);
}

$users = file($FileUsers);
$u = "";
foreach($users as $u)
{
    list($ip, $time) = explode("|", $u);
    $user[$ip] = $time;
}

if (isset($user[$now_ip]))
{
    $user[$now_ip] = $now_time;
    $fp = fopen($FileUsers, "w+");
    while (list($key, $value) = each($user)) fwrite($fp, "$key|$value|\n");
    fclose($fp);
}

if (!isset($user[$now_ip]))
{
    $AllCount=$AllCount+1;
    $DayCount=$DayCount+1;

    $fp = fopen($FileAllCount, "w+");
    fwrite($fp, $AllCount);
    fclose($fp);

    $fp = fopen($filename, "w+");
    fwrite($fp, $DayCount);
    fclose($fp);

    $user[$now_ip] = $now_time;

    $fp = fopen($FileUsers, "w+");
    while (list($key, $value) = each($user)) fwrite($fp, "$key|$value|\n");
    fclose($fp);
}

?>

Автор: PARROT 12.4.2005, 12:40
Вы просили пример? Вам его дали! Тут не выкладывают скрипты для обсуждения (у кого лучше или хуже!)
Лучше у Вас- Замечательно! Поздравляю! Так держать.
Вас где воспитывали???

Автор: InfMag 12.4.2005, 18:58
PARROT
Я не осуждал твой скрипт, я предупредил, что если ты его будешь использовать, то у тебя может появиться трабл. Для тебя ж старался. smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)