1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 |
class IPGeoBase { private $fhandleCIDR, $fhandleCities, $fSizeCIDR, $fsizeCities; /* * @brief Конструктор * * @param CIDRFile файл базы диапазонов IP (cidr_optim.txt) * @param CitiesFile файл базы городов (cities.txt) */ public function __construct($CIDRFile = false, $CitiesFile = false) { if (!$CIDRFile) { $CIDRFile = dirname(__FILE__) . '/cidr_optim.txt'; } if (!$CitiesFile) { $CitiesFile = dirname(__FILE__) . '/cities.txt'; } $this->fhandleCIDR = fopen($CIDRFile, 'r') or die("Cannot open $CIDRFile"); $this->fhandleCities = fopen($CitiesFile, 'r') or die("Cannot open $CitiesFile"); $this->fSizeCIDR = filesize($CIDRFile); $this->fsizeCities = filesize($CitiesFile); } /* * @brief Получение информации о городе по индексу * @param idx индекс города * @return массив или false, если не найдено */ private function getCityByIdx($idx) { rewind($this->fhandleCities); while (!feof($this->fhandleCities)) { $str = fgets($this->fhandleCities); $arRecord = explode("\t", trim($str)); if ($arRecord[0] == $idx) { return array('city' => $arRecord[1], 'region' => $arRecord[2], 'district' => $arRecord[3], 'lat' => $arRecord[4], 'lng' => $arRecord[5]); } } return false; } /* * @brief Получение гео-информации по IP * @param ip IPv4-адрес * @return массив или false, если не найдено */ public function getRecord($ip) { $ip = sprintf('%u', ip2long($ip)); rewind($this->fhandleCIDR); $rad = floor($this->fSizeCIDR / 2); $pos = $rad; while (fseek($this->fhandleCIDR, $pos, SEEK_SET) != -1) { if ($rad) { $str = fgets($this->fhandleCIDR); } else { rewind($this->fhandleCIDR); } $str = fgets($this->fhandleCIDR); if (!$str) { return false; } $arRecord = explode("\t", trim($str)); $rad = floor($rad / 2); if (!$rad && ($ip < $arRecord[0] || $ip > $arRecord[1])) { return false; } if ($ip < $arRecord[0]) { $pos -= $rad; } elseif ($ip > $arRecord[1]) { $pos += $rad; } else { $result = array('range' => $arRecord[2], 'cc' => $arRecord[3]); if ($arRecord[4] != '-' && $cityResult = $this->getCityByIdx($arRecord[4])) { $result += $cityResult; } return $result; } } return false; } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
public function myGeoIp() { $gb = new IPGeoBase(); if ($_SERVER['HTTP_FORWARDED']) { $data = $gb->getRecord(substr($_SERVER["HTTP_FORWARDED"], 4)); } else { $data = $gb->getRecord($_SERVER["REMOTE_ADDR"]); } $msk = array( "Москва", "Московская область", ); $spb = array( "Санкт-Петербург", "Ленинградская область", ); $data['region'] = iconv('windows-1251', 'UTF-8', $data['region']); if (in_array($data['region'], $spb)) { $result = 'SPB'; } elseif (in_array($data['region'], $msk)) { $result = 'MSK'; } else { $result = 'RUS'; } return $result; } |
Скачать файл geoIP
cites — Города
cide_optim — IP и соответствие их к региону/Городу