Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> счётчики 
V
    Опции темы
stab
Дата 13.3.2006, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: нет
Всего: 48



Как сделать три счётчика статисики для вывода на сайте: downloads (на один файл), today visitors, total visitors? Интересует, как именно считать и хранить.


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
oksale
Дата 13.3.2006, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 192
Регистрация: 17.6.2005
Где: Санкт-Петербург

Репутация: 1
Всего: 9



Это должно помочь.
--------------------
WBR, oksale
PM MAIL ICQ   Вверх
R.M.
Дата 13.3.2006, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Анархист
****


Профиль
Группа: Участник
Сообщений: 2164
Регистрация: 8.6.2005
Где: Питер

Репутация: -2
Всего: 30



Цитата(cully @ 13.3.2006, 15:58 Найти цитируемый пост)
downloads

Делай ссылку не на файл а на скрипт который добавит запись в базу и потом перенаправит или запустит сам файл

Цитата(cully @ 13.3.2006, 15:58 Найти цитируемый пост)
today visitors

Всех людей пришедших заносиш в базу и выводиш mysql_num_rows только тех у которых дата H:i:s или как ты там храниш дату

Цитата(cully @ 13.3.2006, 15:58 Найти цитируемый пост)
total visitors

Как в предыдущем только вывод mysql_num_rows всех


--------------------
Помнишь как бодрили дискотеки прошлого века? Теперь стул, компьютер и нету человека.

Nokia LifeStyle - Всё для смартфонов Nokia 
PM MAIL WWW ICQ   Вверх
stab
Дата 13.3.2006, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: нет
Всего: 48



Слишком сложно, по сути надо хранить всего три значения, а считать видима так:

* downloads - скрипт увеличивает на еденичку счётчик, потом редирект.
* today visitors - кидать куку с датой, если её нет или дата не сегодняшняя, то увеличить счётчик на единицу. раз в сутки сброс в ноль.
* total visitors - каждый раз увеличивать на единицу при увеличении today visitors.

Через куки не очень надежно, но точности особой не надо. Основной вопрос как хранить. Я совсем чайник в скриптовых делах.


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
stab
Дата 13.3.2006, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: нет
Всего: 48



Может просто в файле? но тогда как себя поведёт этот файл, если паралельно несколько запросов буду выполняться?


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
клоп
Дата 13.3.2006, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 28.2.2006
Где: г. Череповец

Репутация: нет
Всего: нет



Цитата(cully @ 13.3.2006, 17:19)
Может просто в файле? но тогда как себя поведёт этот файл, если паралельно несколько запросов буду выполняться?

Он просто обнулиться. Используй блокировку.
--------------------
Всякая чепуха посещает голову, когда она пуста ....
PM MAIL WWW   Вверх
stab
Дата 13.3.2006, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: нет
Всего: 48



Цитата(клоп @ 13.3.2006, 21:24 Найти цитируемый пост)
Используй блокировку.


а вот с этого места подробнее, пожалуйста smile



--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
R.M.
Дата 13.3.2006, 18:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Анархист
****


Профиль
Группа: Участник
Сообщений: 2164
Регистрация: 8.6.2005
Где: Питер

Репутация: -2
Всего: 30



cully, я бы даже не заморачивался с файлами, кликни мне в подпись, внизу увидиш статистику на БД


--------------------
Помнишь как бодрили дискотеки прошлого века? Теперь стул, компьютер и нету человека.

Nokia LifeStyle - Всё для смартфонов Nokia 
PM MAIL WWW ICQ   Вверх
клоп
Дата 14.3.2006, 10:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 28.2.2006
Где: г. Череповец

Репутация: нет
Всего: нет



Цитата(cully @ 13.3.2006, 17:33)
Цитата(клоп @  13.3.2006,  21:24 Найти цитируемый пост)
Используй блокировку.


а вот с этого места подробнее, пожалуйста smile

Код

<?php

$fp = fopen("count.txt", "w+");// count.txt - твой файл

if (flock($fp, LOCK_EX)) { // выполнить эксплюзивное запирание
   fwrite($fp, "Что-нибудь пишем\n");
   flock($fp, LOCK_UN); // отпираем файл
} else {
   echo "Не могу запереть файл !";
}

fclose($fp);

?> 

--------------------
Всякая чепуха посещает голову, когда она пуста ....
PM MAIL WWW   Вверх
stab
Дата 14.3.2006, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: нет
Всего: 48



Мне тут предложили оригинальное решение, спешу поделиться. Запись байта в файл - атомарная операция, ни каких локов не надо. Заводим три файла: downloads.ctr, today-visitors.ctr, total-visitors.ctr. Когда надо дописываем по байту, размер каждого из файлов и есть нужное нам значение.

А как записать один байт? smile fwrite($fp, "1")? или это два будет?


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
Guedda
Дата 14.3.2006, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Подрывник
****


Профиль
Группа: Завсегдатай
Сообщений: 3137
Регистрация: 27.12.2005
Где: Ростов-на-Дону

Репутация: 13
Всего: 78



Каждый символ - это один байт.


--------------------
Ll 2
PM MAIL WWW ICQ Skype GTalk   Вверх
stab
Дата 14.3.2006, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: нет
Всего: 48



Ясна, спасиба, я насчёт нуля думал на конце. Я же десктопный программер. smile


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
клоп
Дата 14.3.2006, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 28.2.2006
Где: г. Череповец

Репутация: нет
Всего: нет



Я сам если честно запарился с текстовыми счетчиками. В электронной газете предприятия где я тружусь, в день выпуска номера в онлайне бывает 150-200 чел одновременно, блокировка не помогает. Минимум 1-2 раза в неделю счетчик прочтения статьи обнуляется. Незнаю что и делать. Воn код, мож кто что подскажет как еще избегать обнуления?
Код

$article_counter = file("$path/data/counter.txt");
$article_counteradd = @fopen("$path/data/counter.txt", w);
flock($article_counteradd, LOCK_EX);
foreach ($article_counter as $counter_line)
{
 $count_arr = explode("|", $counter_line);
 if ($count_arr[0] != $news_arr[0])
 {
 
   fwrite($article_counteradd, $counter_line);

 }
 else
 {
   $foundcount = 1;
   $count=$count_arr[1];
   $count++;
  
   fwrite ($article_counteradd, "$count_arr[0]|$count|\n");
 
 }
}
if ($foundcount != 1)
{
 $foundcount = 1;
 
 fwrite ($article_counteradd, "$news_arr[0]|1|\n");
 
}
 flock($article_counteradd, LOCK_UN); 
fclose ($article_counteradd);


где: $news_arr[0] - TIMESTAMP статьи
--------------------
Всякая чепуха посещает голову, когда она пуста ....
PM MAIL WWW   Вверх
Guedda
Дата 14.3.2006, 17:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Подрывник
****


Профиль
Группа: Завсегдатай
Сообщений: 3137
Регистрация: 27.12.2005
Где: Ростов-на-Дону

Репутация: 13
Всего: 78



А что, базы данных не устраивают? При таком количестве посещений необходимо, я думаю, использовать БД...


--------------------
Ll 2
PM MAIL WWW ICQ Skype GTalk   Вверх
клоп
Дата 14.3.2006, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 28.2.2006
Где: г. Череповец

Репутация: нет
Всего: нет



Цитата(Guedda @ 14.3.2006, 17:40)
А что, базы данных не устраивают? При таком количестве посещений необходимо, я думаю, использовать БД...

Базы устраивают, просто когда все начиналось год назад то совсем не предполагалось такого количества в онлайне. Текстовые файлы справлялись с нагрузкой. А с другой стороны разве законы записи в БД сильно отличаются? Там (см. код выше) веть тоже используется примерно такая же блокировка когда обрабатывается один процесс из многих а другие ждут. Реально ли как то более стабилизировать или ужесточить это в моем примере? Там по идее на запись имеет право только один процесс (при LOCK_EX) а остальные в это время только читать могут. Конечно я понимаю что сброс происходит когда одновременно, секунда в секунду, к файлу на запись попадает два или более процесса, и что секунда это слишком большая величина при такой нагрузке.....
Есть мысль как-то прикрутить microtime() к timestamp, но как пока мне не ясно. Может кто еще что предложит помимо перехода на БД или разовьет на примере мою мысль? Буду презнателен.
--------------------
Всякая чепуха посещает голову, когда она пуста ....
PM MAIL WWW   Вверх
lasalexx
Дата 14.3.2006, 23:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 192
Регистрация: 19.7.2004
Где: Tbilisi

Репутация: 1
Всего: 1



могу своим кодом поделиться:

Код

<?
//mysql user-name
define("USER","username");

//mysql password
define("PASS","password");

//mysql database
define("DATABASE","database");

//id of your site
define("IDEN", "your id");

class counter
{
var $regdate;
var $online;
var $today;
var $all;

function counter($id,$ip_addr)
{
mysql_connect("localhost",USER,PASS) or die("Couldn't connect mysql databases");
mysql_select_db(DATABASE);

$query="SELECT today, vsego, segodna, regdate FROM counter WHERE id=\"".$id."\"";
$result=mysql_query($query);
if(mysql_num_rows($result)==0) return 0;

$this->online=$this->now($id,$ip_addr);
$this->regdate=mysql_result($result,0,"regdate");
$to=mysql_result($result,0,"today");
$t=explode("|",$to);
$a=mysql_result($result,0,"vsego");
$d=mysql_result($result,0,"segodna");

$ip=$ip_addr;
$novi_den=date("Y:m:d");
if($novi_den>$d)
{
$vchera=sizeof($t);
$query="UPDATE counter SET vsego=\"".($a+$vchera)."\", today=\"".$ip."\", segodna=\"".$novi_den."\" WHERE id=\"".$id."\"";
mysql_query($query);
$this->all=$vchera+$a+1;
$this->today=1;
mysql_free_result($result);
mysql_close();
return 1;
}

if(in_array($ip,$t))
{
$this->all=$a+sizeof($t);
$this->today=sizeof($t);
mysql_free_result($result);
mysql_close();
return 1;
}

$query="UPDATE counter SET today=\"".$to."|".$ip."\" WHERE id=\"".$id."\"";
mysql_query($query);
$this->today=sizeof($t)+1;
$this->all=$a+sizeof($t)+1;
mysql_free_result($result);
mysql_close();
return 1;
}


function now($id,$ip_addr)
{
$set_time=(int)date("i")*60+(int)date("s")+60;
$now_time=(int)date("i")*60+(int)date("s");

$query="SELECT online FROM counter WHERE id=\"".$id."\"";
$result=mysql_query($query);
$users=mysql_result($result,0,"online");

if(!$users)
{
$str=$ip_addr."=>".$now_time;
$query="UPDATE counter SET online=\"".$str."\" WHERE id=\"".$id."\"";
mysql_query($query);
return 1;
}

$mas=explode("|",$users);
for($i=0; $i<sizeof($mas); $i++) $mas[$i]=explode("=>",$mas[$i]);

$i=0;
while($i<sizeof($mas)&&($mas[$i][1]<$now_time||($mas[$i][1]-$now_time>60))) array_shift($mas);

if(!$mas)
{
$str=$ip_addr."=>".$set_time;
$query="UPDATE counter SET online=\"".$str."\" WHERE id=\"".$id."\"";
mysql_query($query);
return 1;
}

$ip=$ip_addr;
for($i=0; $i<sizeof($mas); $i++)
    if($mas[$i][0]==$ip) {$mas[$i][1]=$set_time; $n=sizeof($mas); break;}

if($i==sizeof($mas))
{
$me=array($ip,$set_time);
$n=array_push($mas,$me);
}

for($i=0; $i<sizeof($mas); $i++) $mas[$i]=implode("=>",$mas[$i]);
$str=implode("|",$mas);
$query="UPDATE counter SET online=\"".$str."\" WHERE id=\"".$id."\"";
mysql_query($query);

return $n;
}


function show()
{
$since=explode(":",$this->regdate);
switch($since[1])
{
case("01"):$since[1]="January"; break;
case("02"):$since[1]="February"; break;
case("03"):$since[1]="March"; break;
case("04"):$since[1]="April"; break;
case("05"):$since[1]="May"; break;
case("06"):$since[1]="June"; break;
case("07"):$since[1]="July"; break;
case("08"):$since[1]="August"; break;
case("09"):$since[1]="September"; break;
case("10"):$since[1]="October"; break;
case("11"):$since[1]="November"; break;
case("12"):$since[1]="December";
}

echo "
Now Online: ".$this->online." | Today: ".$this->today." | Since ".$since[1]." ".$since[2].", ".$since[0].": ".$this->all
."<br>";
}


function _counter()
{
unset($this->regdate);
unset($this->online);
unset($this->today);
unset($this->all);
}

};

$A=new counter(IDEN, $GLOBALS['REMOTE_ADDR']);
$A->show();
$A->_counter();
?>


а таблица вот такая:
Код

CREATE TABLE counter (
  id varchar(30) NOT NULL default '',
  domain varchar(150) NOT NULL default '',
  online longtext NOT NULL,
  today longtext NOT NULL,
  vsego varchar(12) NOT NULL default '',
  segodna varchar(12) NOT NULL default '',
  regdate varchar(12) NOT NULL default '',
  PRIMARY KEY  (id)
) TYPE=MyISAM;


id - идентификатор сайта. так что эта таблица может работать для нескольких сайтов.
считает сколько уникальных юзеров зашло за всё время существовния сайта, сколько сегодня и сколько на данный момент. не использует cookies.

Это сообщение отредактировал(а) lasalexx - 14.3.2006, 23:28
PM MAIL WWW ICQ MSN   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1265 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.