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

Статус
В этой теме нельзя размещать новые ответы.

m6kin

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



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

Первой строчкой кода - $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]"; ?>
 
Что то у меня от него шаб повело !
Что то здесь не так ! :confused:
 
Не знаю, у меня все работает….

Добавлено через 2 минуты
да и как бы шаб не при чем)
 
Можно так, только права нужно выставить адекватно
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);

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

При этом автор не объясняет для чего читает первые 100 байт из файла
 
Добрый день! У меня такой вопрос на форуме
Для просмотра ссылки Войди или Зарегистрируйся
есть в боковой колонке: my radio, калькулятор, календарь, гороскоп. банкомат, игра Lines. Мне бы очень хотелось узнать, какими "прибамбасами" люди больше пользуются. что бы нужные оставить, а не пользующиеся спросом - заменить.
Хотелось бы иметь такое:
Для просмотра ссылки Войди или Зарегистрируйся
В боковой панели гдг-то это картинки, а гдг-то скрипты, но можно все , при необходимости заменить картинками с линками.
Хотелось бы что б внизу, что бы выводилось: - Посетило:ХХ, ну или что-то в этом роде (на скрине я приписал).
Я тут присмотрел топики и...как на китайском, что куда вставлять и сто как выводить. ну не понятно, не потому, что плохо написано, а потому, что извилин наверное маловато! Помогите кто может!!!
 
Люди помогите (пост №6), я сам не могу осилить, если нужна оплата, сброшу на кошелек! ОЧЕНЬ НАДО!!!
 
Люди помогите (пост №6), я сам не могу осилить

Сделай опрос на форуме, люди подскажут.

Ну а если хочешь программно, то в этой теме выложили 2 счетчика.
Надо всего лишь отредактировать плагины к вобле.
 
Сделай опрос на форуме, люди подскажут.
А я что делаю7
Ну а если хочешь программно, то в этой теме выложили 2 счетчика.
Надо всего лишь отредактировать плагины к вобле.
Если бы Я это мог, не предлагал бы оплату!!!
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху