Блог And-rey.ru Блог And-rey.ru Блог And-rey.ru
Логин:
Регистрация Пароль:

Начало / ip_runet


And-rey:ip_runet (08.10.08 14:40)
  
Для http://ipgeobase.ru
 
Предварительная разметка файла cidr_ru_master_index.db позволяет использовать ограничение памяти для php в 2 мегабайта.
 
Для использования с разметкой скрипт сначала нужно запустить в командной строке с параметром new_master
# /usr/local/bin/php ~/ip_runet.php new_master
В противном случае поменять параметр $new_master на false
 
PHP
  1. <?php
  2.  
  3. //***********************************************************************
  4. // Назначение: ip_runet (06.06.2008)
  5. //             cоздание pазмеченной базы и поиск (для ipgeobase.ru)
  6. //***********************************************************************
  7.  
  8.  
  9. // Используется новый мастер файл
  10. $new_master = true;
  11.  
  12. // файлы
  13. $master_fale     = 'cidr_ru_master_index.db';
  14. $slave_fale      = 'cidr_ru_slave_index.db';
  15. $master_new_fale = 'cidr_ru_master_index_new.db';
  16.  
  17.  
  18. // Создание нового мастер файла
  19. // в командной строке: php ip_runet.php new_master
  20. if ($argc == 1 || @in_array('new_master', $argv)) {
  21.     my_new_master_file($master_fale, $slave_fale, $master_new_fale);
  22.     exit;
  23. }
  24.  
  25.  
  26. // Обработка ввода
  27. if ($_POST['submit']) {
  28.     $long = my_ip_test($_POST['ip']);
  29.     if ($long) {
  30.         $subm_ip = $_POST['ip'];
  31.         if ($new_master) { // Используется new_master (~1МБ памяти)
  32.             $ip_runet = my_ip_runet_new($long, $master_new_fale, $slave_fale);
  33.         } else {           // НЕ используется new_master (~30МБ памяти)
  34.             $ip_runet = my_ip_runet($long, $master_fale, $slave_fale);
  35.         }
  36.         if (!$ip_runet) {
  37.             $error_print = "IP-адреса нет в базе: <b>$subm_ip</b>";
  38.         }
  39.     } else {
  40.         $error_print = 'Некорректный IP-адрес: <b>'.strip_tags($_POST['ip']).'</b>';
  41.     }
  42. }
  43.  
  44.  
  45. // Верх страницы
  46. print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  47.  
  48. <html>
  49. <head>
  50. <title>ip_runet</title>
  51. <meta http-equiv="content-type" content="text/html; charset=windows-1251">
  52. </head>
  53. <body bgcolor="#ffffff">';
  54.  
  55. // Форма
  56. print '
  57. <form action="'.$_SERVER['PHP_SELF'].'" method="post" name="testip">
  58.    IP: <input type="text" name="ip" value="">
  59.    <input type="submit" name="submit" value="ввод"><br>
  60. </form>';
  61.  
  62. // Вывод
  63. if ($ip_runet and !$error_print) { // для Русского IP
  64.     print "
  65.    <table border=0 cellspacing=0 cellpadding=2>
  66.    <tr><td colspan=2>IP адрес <b>$subm_ip</b> найден в базе</td></tr>
  67.    <tr><td>База:</td><td>".(($ip_runet['8'])?"master":"clave")."</td></tr>
  68.    <tr><td>Блок:</td><td>$ip_runet[2]</td></tr>
  69.    <tr><td>Страна:</td><td>$ip_runet[3]</td></tr>
  70.    <tr><td>Город:</td><td>$ip_runet[4]</td></tr>
  71.    <tr><td>Регион:</td><td>$ip_runet[5]</td></tr>
  72.    <tr><td>Округ:</td><td>$ip_runet[6]</td></tr>
  73.    <tr><td>Статус:</td><td>$ip_runet[7]</td></tr>
  74.    </table>";
  75. } elseif ($error_print) {
  76.     print $error_print;
  77. }
  78.  
  79. // Низ страницы
  80. print '</body>
  81. </html>';
  82.  
  83.  
  84. /////////////////// Функции /////////////////////
  85.  
  86. // Проверка корректности IP
  87. function my_ip_test ($ip) {
  88.     $ip = substr($ip, 0, 15);
  89.     $match = array();
  90.     if (preg_match_all("/^([0-9]{1,3})\\.([0-9]{1,3})\\.([0-9]{1,3})\\.([0-9]{1,3})$/", $ip, $match)) {
  91.         $long = sprintf("%u", ip2long($ip));
  92.         if ($long == -1 || $long === FALSE) {
  93.             return false;
  94.         } else {
  95.             return $long;
  96.         }
  97.     } else {
  98.         return false;
  99.     }
  100. }
  101.  
  102.  
  103. // Поиск IP в базе (только новый master_fale)
  104. function my_ip_runet_new ($long, $master_fale, $slave_fale) {
  105.     $master = file($master_fale);
  106.     foreach ($master as $value) {
  107.         $cell = preg_split('/\t/', trim($value));
  108.         if ($long >= $cell['0'] && $long <= $cell['1']) {
  109.             if ($cell['8'] == -1) {
  110.                 return $cell;          // результат в master_fale
  111.             } else {
  112.                 $slave_fp = fopen($slave_fale, "rb");
  113.                 fseek($slave_fp, $cell['10'], SEEK_SET);
  114.                 $i = 1;
  115.                 while ($i <= $cell['9']) {
  116.                     $slave = fgets($slave_fp);
  117.                     $cell2 = preg_split('/\t/', trim($slave));
  118.                     if ($long >= $cell2['0'] && $long <= $cell2['1']) {
  119.                         fclose($slave_fp);
  120.                         return $cell2; // результат в slave_fale
  121.                     }
  122.                     $i++;
  123.                 }
  124.                 fclose($slave_fp);
  125.                 return false;          // нет в slave_fale
  126.             }
  127.         }
  128.     }
  129.     return false;                      // нет в master_fale
  130. }
  131.  
  132.  
  133. // Поиск IP в базе (стандартный master_fale)
  134. function my_ip_runet ($long, $master_fale, $slave_fale) {
  135.     $master = file($master_fale);
  136.     foreach ($master as $value) {
  137.         $cell = preg_split('/\t/', trim($value));
  138.         if ($long >= $cell['0'] && $long <= $cell['1']) {
  139.             if ($cell['8'] == -1) {
  140.                 return $cell;         // результат в master_fale
  141.             } else {
  142.                 $slave = file($slave_fale);
  143.                 $slave = array_slice($slave, $cell['8'], $cell['9']);
  144.                 foreach ($slave as $value) {
  145.                     $cell = preg_split('/\t/', trim($value));
  146.                     if ($long >= $cell['0'] && $long <= $cell['1']) {
  147.                         return $cell; // результат в slave_fale
  148.                     }
  149.                 }
  150.                 return false;         // нет в slave_fale
  151.             }
  152.         }
  153.     }
  154.     return false;                     // нет в master_fale
  155. }
  156.  
  157.  
  158. // Расстановка смещений для строк (в командной строке)
  159. function my_new_master_file ($master_fale, $slave_fale, $master_new_fale) {
  160.     $time = time();
  161.     print "start my_new_master_file\n";
  162.    
  163.     // потоки
  164.     $master_fp     = fopen($master_fale,     "rb");
  165.     $slave_fp      = fopen($slave_fale,      "rb");
  166.     $master_new_fp = fopen($master_new_fale, "wb");
  167.  
  168.     // обработка
  169.     while (!feof($master_fp)) {
  170.         $master_line = fgets($master_fp);
  171.         $master_line = trim($master_line);
  172.         $cell = preg_split('/\t/', $master_line);
  173.         if ($cell['8'] == '-1' or $cell['8'] == '0') {
  174.             fwrite($master_new_fp, $master_line . "\t0\n");
  175.         } else {
  176.             rewind($slave_fp); // вернутся в начало
  177.             $i = 2;
  178.             while (!feof($slave_fp)) {
  179.                 fgets($slave_fp);
  180.                 if ($i == $cell['8']) {
  181.                     $a = ftell($slave_fp); // текущее смещение
  182.                     fwrite($master_new_fp, $master_line . "\t" . $a . "\n");
  183.                     break;
  184.                 }
  185.                 $i++;
  186.             }
  187.         }
  188.     }
  189.    
  190.     // закрыть
  191.     fclose($master_fp);
  192.     fclose($slave_fp);
  193.     fclose($master_new_fp);
  194.    
  195.     $time = time()-$time;
  196.     print "stop - time: $time c.\n";
  197. }
  198.  
  199. ?>

 




<Ответить>
Имя:
Тема:*
Сообщение:[b] [i] [u] [s] [sub] [sup] [left] [center] [right] [justify] [img] [url] [youtube]   [help]
*
 

 

Я сделаю свой блог — с блэкджеком и шлюхами!

2006-2012, CC-BY: Andrey A.