Ваш IP: 35.175.190.77
К сожалению, не можем определить координаты.

Архив рассматриваемых подпрограмм доступен для скачивания по адресу: http://geoip.elib.ru/Clients/geoip_client_php.zip

Этот архив содержит библиотеку, созданную пользователем vyacheslavchulkin, на языке PHP (файл geoip_client.php) для работы с нашим основным сервисом. Он содержит необходимые функции и примеры их использования.

geoip_client

Данная функция использует готовый класс xmlToArray, который преобразует XML в массив. К сожалению обрабатывается только один IP адрес за вызов.

Пример вызова:

<?
require ('./geoip_client.php');

echo '<pre>';

try
{
$opt = '7';
$sid = '1A2B3C4D';
$info = geoip_client('87.255.23.236',$opt,$sid);
echo 'Широта : '.$info[Lat].'<BR>';
echo 'Долгота : '.$info[Lon].'<BR>';
echo 'Город : '.$info[Town].'<BR>';
}
catch (Exception $e) { echo $e->getMessage(); }

echo '</pre>';
?>

В строке 2 подключаем файл библиотеки. В строке 8 присваиваем переменной $opt шестнадцатиричное значение информационных опций (подробное описание информационных опций приведено на странице «Описание основного сервиса«). В строке 9 присваиваем переменной $sid значение уникального кода сайта, полученного при регистрации в «Личном кабинете«. В строке 10 вызываем функцию geoip_client. Функции передаются два параметра: адрес, для которого будет выполнен поиск информации и список информационных опций в шестнадцатиричном виде, определяющих состав искомой информации. После отправки запроса на сервер и получения ответа, функция возвращает массив данных с информацией о запрашиваемом адресе, либо, при возникновении ошибки, выбрасывает исключение. В нашем примере мы хотим получить информацию о явно указанном адресе 87.255.23.236 Однако если мы хотим получить информацию об адресе клиента, то строка 10 должна иметь вид:

$info = geoip_client($_SERVER['REMOTE_ADDR'],$opt,$sid);

В строках 11-13 выводим полученные данные.  Если в процессе выполнения функции geoip_client было выброшено исключение, связанное с получением кода ошибки от сервера или ошибкой связи, то вместо строк 11-13 выполняется строка 15 печатающая сообщение исключения.

Ниже приведен исходный код функции geoip_client

<?
class XmlToArray
{
var $xml='';

function XmlToArray($xml)
{
$this->xml = $xml;
}
function _struct_to_array($values, &$i)
{
$child = array();
if (isset($values[$i]['value'])) array_push($child, $values[$i]['value']);
while ($i++ < count($values)) {
switch ($values[$i]['type']) {
case 'cdata':
array_push($child, $values[$i]['value']);
break;

case 'complete':
$name = $values[$i]['tag'];
if(!empty($name)){
$child[$name]= ($values[$i]['value'])?($values[$i]['value']):'';
if(isset($values[$i]['attributes'])) {
$child[$name] = $values[$i]['attributes'];
}
}
break;
case 'open':
$name = $values[$i]['tag'];
$size = isset($child[$name]) ? sizeof($child[$name]) : 0;
$child[$name][$size] = $this->_struct_to_array($values, $i);
break;
case 'close':
return $child;
break;
}
}
return $child;
}

function createArray()
{
$xml = $this->xml;
$values = array();
$index = array();
$array = array();
$parser = xml_parser_create();
xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
xml_parse_into_struct($parser, $xml, $values, $index);
xml_parser_free($parser);
$i = 0;
$name = $values[$i]['tag'];
$array[$name] = isset($values[$i]['attributes']) ? $values[$i]['attributes'] : '';
$array[$name] = $this->_struct_to_array($values, $i);
return $array;
}
}

function geoip_client($ip,$opt)
{
// Делаем запрос к серверу
if($xml = file_get_contents('http://geoip.elib.ru/cgi-bin/getdata.pl?ip='.$ip.'&hex='.$opt.'&sid='.$sid))
{
$xmlObj = new XmlToArray($xml); // преобразуем xml в массив
$arrayData = $xmlObj->createArray();

// если есть ошибки выбрасываем исключения
if(isset($arrayData['GeoIP']['GeoAddr'][0]['Error']))
{
switch ($arrayData['GeoIP']['GeoAddr'][0]['Error'])
{
case 0:;
break;
case 10:throw new Exception('Geo_IP: Неверная длина указанного адреса');
break;
case 11:throw new Exception('Geo_IP: Неверный формат адреса');
break;
case 150:throw new Exception('Geo_IP: Внутренняя ошибка сервера');
break;
case 162:throw new Exception('Geo_IP: Идентификатор сайта не указан');
break;
case 163:throw new Exception('Geo_IP: Идентификатор сайта содержит ошибку или не зарегистрирован');
break;
case 200:throw new Exception('Geo_IP: Ошибка соединения с сервером');
break;
case 205:throw new Exception('Geo_IP: Нет данных по запросу');
break;
}
}
// возвращаем полученные данные в виде массива
return $arrayData['GeoIP']['GeoAddr'][0];
}
else
{
// если ответа от сервера не дождались вбрасываем исключение
throw new Exception('Geo_IP: Нет связи с сервером');
}

}
?>

Замечания проекта: Хочется иметь возможность указывать функции не один IP адрес, а список. Это полезно, например, при анализе логов.