Вход Регистрация
Файл: vkolhoze.com/geo/ipgeobase.php
Строк: 74
<?php
/*
    Class for working with ipgeobase.ru geo database.

    Copyright (C) 2013, Vladislav Ross

    This library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Lesser General Public
    License as published by the Free Software Foundation; either
    version 2.1 of the License, or (at your option) any later version.

    This library is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    Lesser General Public License for more details.

    You should have received a copy of the GNU Lesser General Public
    License along with this library; if not, write to the Free Software
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA

    E-mail: vladislav.ross@gmail.com
    URL: https://github.com/rossvs/ipgeobase.php
    
*/
/*
 * @class IPGeoBase
 * @brief Класс для работы с текстовыми базами ipgeobase.ru
 * @see example.php
 *
 * Определяет страну, регион и город по IP для России и Украины
 */
class IPGeoBase 
{
    private 
$fhandleCIDR$fhandleCities$fSizeCIDR$fsizeCities;

    
/*
     * @brief Конструктор
     *
     * @param CIDRFile файл базы диапазонов IP (cidr_optim.txt)
     * @param CitiesFile файл базы городов (cities.txt)
     */
    
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, если не найдено
     */
    
function getRecord($ip)
    {
        
$ip sprintf('%u'ip2long($ip));
        
        
rewind($this->fhandleCIDR);
        
$rad floor($this->fSizeCIDR 2);
        
$pos $rad;
        while(
fseek($this->fhandleCIDR$posSEEK_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
Реклама