Подсчет уникальных посетителей - как?

Alex_prog

Новичок
Подсчет уникальных посетителей - как?

Добрый день.
Задача такая: посетитель заходит на сайт, необходимо определить - был ли этот посетитель на этом сайте в течении прошедших 24 часов или нет.
Уникальноть основывается на IP посетителя, а не на куке. MySQL использоваться не должен.
Если ли какие-нибудь готовые решения для такой задачи? Я сам это решил топорным методом, но подозреваю это далеко не идеал :
PHP:
	function Is_unique(){
		if(!file_exists($this->file)) return true;
		$str="";
		$numbers=explode(".",$this->userIP);
		foreach ($numbers as $n) $str.=chr($n);

		$handle = fopen($this->file, "rb+");
		while (!feof($handle)) {
			$buffer = fgets($handle, 20480);
			$pos = strpos($buffer, $str);
			if ($pos === false) continue;
			else return false;
		}
		fclose($handle);
		return true;;
	}
	function Add_unique(){
		$str="";
		$numbers=explode(".",$this->userIP);
		foreach ($numbers as $n) $str.=chr($n);
		$handle = fopen($this->file, "ab+");
		fwrite($handle,$str."-");
		fclose($handle);
		@chmod($this->file,0777);
	}
- то есть тупо пишу в файл chr() от каждой триады IP посетителя, а потом, при проверке, считываю по частям файл и ищу там эту IP strpos'ом. При большом количестве посетителей (скажем 200к) файл с IP раздувается до 1Мб, соответсвенно искать в нем подстроку длиной 4 байта - дело затратное.
Вобщем, можно ли все это усовершенствовать? :)
 

Фанат

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

Ты хорошо подумал над исходными установками? У тебя есть ответ на вопрос, для чего это вообще нужно?

Ты хорошо подумал над алгоритмом?
я правильно понимаю, что если в базе идут подряд два айпишника 195.5.212.10 и 205.11.3.109, то айпишник 212.10. 205.11 будет отсеян, как уже заходивший?
 

Alex_prog

Новичок
Задача поставлена корректно. Подсчитывать нужно даже больше чем 200к, но для бОльших трафиков введено ограничение на размер файлов IP - 1Мб. По сути это ограничивает кол-во часов хранения уникальных IP.

Именно PHP и именно без мускля. Это уже используется на рабочем проекте, но хотелось бы сжалиться над железом :)

Начет тех двух IP что ты привел - они будут разделены разделителем ('-'), поэтому 212.10. 205.11 будет уникальным. В этом подходе, с разделителем, есть тоже погрешность, и равна она 1/256 = 0.4%, что вполне допуcтимо для меня.
 

Фанат

oncle terrible
Команда форума
Всегда пожалуйста.
Если на дороге стоит москвич в кювете, а рядом - трактор, то пусть водила москвича не обижается, когда в ответ на его просьбу помочь вытянуть автомобиль руками, проезщающие только крутят пальцами у виска.
 

Alex_prog

Новичок
Это ты к чему? К тому что надо подобные весчи реализовывать на сях и/или используя мускль?
 

123av

Новичок
а чего не конвертируешь ИП в число ? мне кажется так тебе было бы легче.
 

physh

поедатель запятых
извините что мучаю своим нубовским вопросом, но мне просто интересно:
file_exists()
fopen()
fwrite()
fclose()
они действительно меньше загружают машину чем пара query к mysql?
 

Krishna

Продался Java
Это ты к чему? К тому что надо подобные весчи реализовывать на сях и/или используя мускль?
Не то, чтобы "надо". Просто так делают адекватные люди...

-~{}~ 10.02.07 17:16:

извините что мучаю своим нубовским вопросом, но мне просто интересно:
file_exists()
fopen()
fwrite()
fclose()
они действительно меньше загружают машину чем пара query к mysql?
да, меньше, ведь СУБД в конечном счете делает то же самое, если не учитывать кешировние запросов и буферы

но вот это:
$buffer = fgets($handle, 20480);
$pos = strpos($buffer, $str);
куда больше
 

john.brown

просто кулибин
На уровне бреда, но тем не менее. А че саму файловую систему как базу не использовать? Т.е. сделать из адреса путь к файлу 212/10/205/11, и в фаилик записывать тиместамп посдеднего обращения... Так абстрактно теоретически должно быть быстро...
 

123av

Новичок
john.brown
:D

для того чуда надо скази ставить и еще штуки 3 зеркала к нему
 

Фанат

oncle terrible
Команда форума
physh
здесь речь идет не о fopen, а о том что в мускуле вся эта таблица айпишнегов висит все время в памяти.
Alex_prog
пусть не самому писать на сях, но использование готовой программы может увеличить скорость в разы
 

john.brown

просто кулибин
Да, погарячился :) Загрузка проца меньше, но диск наяривает...
 
Сверху