Как лучше всего сохранять IP адреса для статистики.

Например для написания  системы счётчиков, обсчёта статистики посещений, требуется запись большого количества IP адресов и приходится часто сравнивать их, что приводит к высоким нагрузкам. Например мы сохраняем разные IP чтобы узнать сколько уникальных посетителей у нас было!

Далее описанный мой способ сохранения и проверки IP адресов улучшает производительность в 4 раза. (посравнению с обычным)

1. Способ сохранения
- в Mysql используем поле text
- в файлах, каждому аккаунту свой фаил с IP например в папке ips: ips/user1.dat
- при использовании памяти, необходимо выделить достаточно

2. Метод кодирования и оптимизации
Каждый IP выглядит примерно так: 123.123.123.123
получаем 15 символов + один символ для разделения IP-адресов = 16
Столько требуется для записи одного IP, а для 1000 выходит уже 16кб информации!
Уменьшаем в 4 раза следующим способом:

Код:
$ip=$REMOTE_ADDR; $a=explode(".",$ip);
$ip=chr($a[0]).chr($a[1]).chr($a[2]).chr($a[3]);

Теперь наш IP закодирован и составляет всего 4 символа.
Добавление в фаил с IP адресами происходит без разделителя, он нам не нужен.

3. Как проверить присутствие такого IP в переменной (из файла или Mysql) и добавить новый.
Мы получаем переменную с нашими закодированными IP адресами например из файла так:

Код:
$ips=file_get_contents("ips/user1.dat");

Теперь закодируем наш IP для проверки его в файле:

Код:
$ip=$REMOTE_ADDR; $a=explode(".",$ip);
$ip=chr($a[0]).chr($a[1]).chr($a[2]).chr($a[3]);

Проверим наличие $ip в переменной $ips перебирая их через каждые 4 символа:

Код:
$found=0;
for($i=0;$i<strlen($ips);$i+=4) if($ips[$i]==$ip[0]) if($ip==substr($ips,$i,4)) {$found=1;break;}

if($ips[$i]==$ip[0]) - используется для оптимизации процесса поиска
Теперь если IP ненайден то добавим его:
предполагается что у вас  php4 и функция file_put_contents не существует, тогда воспользуемся стандартной процедурой добавления записи в фаил...

Код:
$f=fopen("ips/user1.dat","a");
fwrite($f,$ip);
fclose($f);

Для работы с MYSQL и памятью читайте на php.net
Ну вот и всё, считаю что это самый оптимальный и продуктивный способ для создания подобных систем.

2007 copyright by demon