Простой скрипт для подсчета посещений/кликов

Тема в разделе "PHP", создана пользователем m6kin, 29 окт 2008.

Статус темы:
Закрыта.
Модераторы: latteo
  1. m6kin

    m6kin Постоялец

    Регистр.:
    20 окт 2008
    Сообщения:
    51
    Симпатии:
    22
    Вот нашел у себя в компе такой скрипт (автор: Владислав Путяк)

    <?php

    $f=fopen("stat.dat","a+");
    flock($f,LOCK_EX);
    $count=fread($f,100);
    @$count++;
    ftruncate($f,0);
    fwrite($f,$count);
    fflush($f);
    flock($f,LOCK_UN);
    fclose($f);

    ?>

    Это и есть весь скрипт. А теперь давайте разберемся, что и как в нем работает.

    Первой строчкой кода - $f=fopen("stat.dat","a+"); мы открываем файл stat.dat для чтения и записи, связываем его с файловой переменной $f. Именно этот файл будет хранить данные о состоянии счетчика. Для правильной работы советую устанавливать для данного файла права доступа 777 или аналогичные с полным доступом на чтение и запись.

    Следующая строчка - flock($f,LOCK_EX); очень важна для работоспособности скрипта. Что она делает? Она на время работы данного скрипта (или до ее снятия) блокирует доступ к файлу для других скриптов или копии данного. Почему это так важно? Давайте представим ситуацию: в тот момент, когда пользователь1 кликает на ссылку, запускающую скрипт подсчета кликов, по той же ссылке кликает пользователь2, запуская копию того же скрипта. Как вы увидите далее, в зависимости от того, на какой стадии выполнения находится скрипт, запущенный пользователем1, скрипт запущенный пользователем2 и работающий параллельно со своей копией может попросту обнулить счетчик. Эту ошибку допускают практически все начинающие программисты на PHP, создавая подобные счетчики. Теперь, я думаю ясно, зачем нам блокировка доступа к файлу - в данном случае скрипт, запущенный пользователем2 будет ждать пока отработает скрипт, запущенный пользователем1 (не стоит пугаться, что это замедлит загрузку страниц - даже самые медленные серверы выполняют данный скрипт за сотые доли секунды).

    С 3-й строчкой кода $count=fread($f,100); все ясно. В переменную $count считываем значение счетчика.

    Далее, страхуясь от ошибок ввода/вывода (в частности чтения) засчитываем клик/посещение, увеличивая значение счетчика на единицу @$count++;

    Теперь нам осталось произвести запись в файл обновленных данных. Для этого нужно предварительно очистить файл ftruncate($f,0); вот тут и может возникнуть та опасная ситуация с обнулением счетчика, про которую я говорил. Однако мы используем блокировку файла, так что бояться нечего.

    Записываем обновленные данные о значении счетчика fwrite($f,$count);

    Для надежности принудительно очищаем буфер ввода/вывода для данного файла fflush($f);

    Снимаем блокировку с файла flock($f,LOCK_UN); на самом деле ее можно не снимать - она автоматически снимается после закрытия файла. Однако для полноты примера я ее все же написал.

    Закрытие файла fclose($f); тоже не обязательная функция т.к. все открытые скриптом файлы, после завершения его работы, автоматически закрываются. Но опять же, для полноты примера... =) кроме того, если на этом скрипт не заканчивается, а работать с файлом более не понадобится, рекомендуется сразу же закрывать файл.

    Теперь для подсчета количества посещений, просто вставляйте данный код в страницу. А если же вы захотели подсчитать количество скачек какого-то файла, то вставляйте данный код в отдельный PHP файл, ссылку с имени файла заменяем на ссылку на данный скрипт, а в конец скрипта дописываем редирект на файл для скачки. Лучше всего его выполнить на PHP: Header("location:/download_dir/file_to_download.rar");

    Вывод значения счетчика можно сделать как в примере самого счетчика:

    <?php

    $f=fopen("stat.dat","a+");
    flock($f,LOCK_EX);
    $count=fread($f,100);
    flock($f,LOCK_UN);
    fclose($f);

    echo "Количество скачек/кликов: $count"; ?>

    А можно чтение параметров и несколько упростить, например, так:

    <?php

    $s=file("stat.dat"); echo "Количество скачек/кликов: $s[0]"; ?>
     
    plushka нравится это.
  2. lagressorl

    lagressorl Создатель

    Регистр.:
    3 сен 2007
    Сообщения:
    17
    Симпатии:
    4
    Что то у меня от него шаб повело !
    Что то здесь не так ! :confused:
     
  3. m6kin

    m6kin Постоялец

    Регистр.:
    20 окт 2008
    Сообщения:
    51
    Симпатии:
    22
    Не знаю, у меня все работает….

    Добавлено через 2 минуты
    да и как бы шаб не при чем)
     
  4. Starik777

    Starik777 Постоялец

    Регистр.:
    19 апр 2008
    Сообщения:
    66
    Симпатии:
    35
    Можно так, только права нужно выставить адекватно
    PHP:
    <?php

    if (!is_dir('stats')){mkdir('stats');}
    $file_name "stats/stat_".date("d-m-y",time()).".dat";

    $f=fopen($file_name,"a+");
    flock($f,LOCK_EX);
        
    $content fread($f,filesize($file_name)+1);
        
    $time date("H:i:s",time());
        
    $file $_SERVER['SCRIPT_FILENAME'];
        
    $ref $_SERVER['HTTP_REFERER'];
        
    $ip $_SERVER['REMOTE_ADDR'];
        if (!
    preg_match("~".preg_quote($ip)."~",$content)){ // комментируем это если нам плевать на дубли
            
    ftruncate($f,0);
            
    $content.="$time\t$ip\t$file\t$ref\n";
            
    fwrite($f,$content);
            
    fflush($f);
        }
    flock($f,LOCK_UN);
    fclose($f);

    ?> 
    информационнее как-то.
     
    plushka нравится это.
  5. saen

    saen

    Регистр.:
    6 авг 2006
    Сообщения:
    756
    Симпатии:
    129
    При этом автор не объясняет для чего читает первые 100 байт из файла
     
  6. sava36

    sava36

    Регистр.:
    13 мар 2007
    Сообщения:
    150
    Симпатии:
    31
    Добрый день! У меня такой вопрос на форуме
    http://gorod.cc/forum/
    есть в боковой колонке: my radio, калькулятор, календарь, гороскоп. банкомат, игра Lines. Мне бы очень хотелось узнать, какими "прибамбасами" люди больше пользуются. что бы нужные оставить, а не пользующиеся спросом - заменить.
    Хотелось бы иметь такое:
    [​IMG]
    В боковой панели гдг-то это картинки, а гдг-то скрипты, но можно все , при необходимости заменить картинками с линками.
    Хотелось бы что б внизу, что бы выводилось: - Посетило:ХХ, ну или что-то в этом роде (на скрине я приписал).
    Я тут присмотрел топики и...как на китайском, что куда вставлять и сто как выводить. ну не понятно, не потому, что плохо написано, а потому, что извилин наверное маловато! Помогите кто может!!!
     
  7. lena berkova

    lena berkova

    Регистр.:
    14 янв 2009
    Сообщения:
    441
    Симпатии:
    19
    наверно вычитывает длину числа. 100 байт значит 100 цифр в числе
     
  8. sava36

    sava36

    Регистр.:
    13 мар 2007
    Сообщения:
    150
    Симпатии:
    31
    Люди помогите (пост №6), я сам не могу осилить, если нужна оплата, сброшу на кошелек! ОЧЕНЬ НАДО!!!
     
  9. tostrss

    tostrss

    Регистр.:
    16 окт 2007
    Сообщения:
    771
    Симпатии:
    217
    Сделай опрос на форуме, люди подскажут.

    Ну а если хочешь программно, то в этой теме выложили 2 счетчика.
    Надо всего лишь отредактировать плагины к вобле.
     
  10. sava36

    sava36

    Регистр.:
    13 мар 2007
    Сообщения:
    150
    Симпатии:
    31
    А я что делаю7
    Если бы Я это мог, не предлагал бы оплату!!!
     
Статус темы:
Закрыта.