Проблемы с GEO

Что-то не работает? Пишите здесь.

Проблемы с GEO

UNREAD_POST Странник » 14.11.2012 10:28:26

Пробую у себя на сайте подключить GEO
Получается что-то странное. Когда смотрю у вас, то всё нормально - и город, и страна.
А у меня выдаёт такое.
Код программы:
include("SxGeo.php");
$SxGeo = new SxGeo('SxGeoCity.dat', SXGEO_BATCH | SXGEO_MEMORY);
$ip=$_SERVER["REMOTE_ADDR"];
$city=$SxGeo->getCityFull($ip);
print_r($city);
Результат выдачи:
Array (
[regid] => 2966469072
[cc] => 186
[fips] => в
[lat] => 3501.772987
[lon] => 3501.91616
[country] => RW
[city] =>
[region_name] =>
[timezone] =>
)
Что не так делаю?
IP 62.220.33.xx
Странник
 
Сообщения: 8
Зарегистрирован: 14.11.2012 10:21:11

Re: Проблемы с GEO

UNREAD_POST mag » 14.11.2012 18:00:38

это проблема 64-битности
решается тем, что в классе SxGeo.php
после строки
Код: Выделить всё
$this->city = unpack('Nregid/Ccc/a2fips/Nlat/Nlon', $raw);


нужно добавить проверку такого рода:

Код: Выделить всё
   if(PHP_INT_SIZE > 4) {
         if ($this->city['lat'] > $this->max_int) {
            $this->city['lat'] |= 0xffffffff00000000;
         }
         if ($this->city['lon'] > $this->max_int) {
            $this->city['lon'] |= 0xffffffff00000000;
         }
      }


где $this->max_int - должно быть всегда PHP_MAX_INT в 32-битной версии, то есть 2147483647

после этих небольших изменений всё работает хорошо
Вложения
SxGeo.php.zip
патч к оригинальной библиотеке, поправленный
(323 байт) Скачиваний: 600
Последний раз редактировалось mag 14.11.2012 22:38:50, всего редактировалось 1 раз.
mag
 
Сообщения: 4
Зарегистрирован: 14.11.2012 17:44:08

Re: Проблемы с GEO

UNREAD_POST Странник » 14.11.2012 19:47:09

Мало что изменилось.
Город не определён, страна не Россия и т.д.

Результат до изменения
regid = 2966469072
cc = 186
fips = в
lat = 3501.772987
lon = 3501.91616
country = RW
city =
region_name =
timezone =

Результат после изменения
regid = 2966469072
cc = 186
fips = в
lat = -793.194309
lon = -793.051136
country = RW
city =
region_name =
timezone =
Странник
 
Сообщения: 8
Зарегистрирован: 14.11.2012 10:21:11

Re: Проблемы с GEO

UNREAD_POST zapimir » 14.11.2012 20:50:55

А какая версия PHP используется?
zapimir
Site Admin
 
Сообщения: 1628
Зарегистрирован: 01.10.2009 22:39:52

Re: Проблемы с GEO

UNREAD_POST mag » 14.11.2012 22:15:24

проверьте $this->max_int
там возможно неверное значение
mag
 
Сообщения: 4
Зарегистрирован: 14.11.2012 17:44:08

Re: Проблемы с GEO

UNREAD_POST Странник » 14.11.2012 22:35:13

zapimir писал(а):А какая версия PHP используется?

PHP Version 5.3.10

mag писал(а):проверьте $this->max_int
там возможно неверное значение

В SxGeo.php вносил такие изменения (как у вас):
$max_int = 0;
$this->max_int = PHP_INT_SIZE == 4 ? PHP_INT_MAX : sqrt(PHP_INT_MAX);
В index.php вставил такое:
$SxGeo = new SxGeo(SxGeoCity.dat', SXGEO_BATCH | SXGEO_MEMORY);
echo $SxGeo->max_int;
На выходе получил 3037000499.976
Странник
 
Сообщения: 8
Зарегистрирован: 14.11.2012 10:21:11

Re: Проблемы с GEO

UNREAD_POST mag » 14.11.2012 23:04:50

поставьте тут
$this->max_int = PHP_INT_SIZE == 4 ? PHP_INT_MAX : sqrt(PHP_INT_MAX);
просто 2147483647

то есть так:
$this->max_int = 2147483647;

должно помочь
mag
 
Сообщения: 4
Зарегистрирован: 14.11.2012 17:44:08

Re: Проблемы с GEO

UNREAD_POST Странник » 14.11.2012 23:29:59

Поставил.
Получил на выходе:
echo $SxGeo->max_int = 2147483647

А дальше опять без изменений:
regid = 2966469072
cc = 186
fips = в
lat = -793.194309
lon = -793.051136
country = RW
city =
region_name =
timezone =

Кстати, если подключаю базу SxGeo.dat и вывожу $SxGeo->get($ip), то выводит правильно. Показывает RU
Странник
 
Сообщения: 8
Зарегистрирован: 14.11.2012 10:21:11

Re: Проблемы с GEO

UNREAD_POST mag » 14.11.2012 23:38:07

странно как-то
у меня была аналогичная проблема и вот те действия что я описал - полностью решили её

может быть есть возможность проверить это на более старой версии пхп и желательно 32-битной?
mag
 
Сообщения: 4
Зарегистрирован: 14.11.2012 17:44:08

Re: Проблемы с GEO

UNREAD_POST Странник » 15.11.2012 09:21:03

Поставил у себя на внутреннем сервере (32 битный).
PHP Version 5.2.13
Без правки SxGeo.php
На выходе получил как положено:
regid = 12895
cc = 185
fips = 51
lat = 56.327358
lon = 43.985191
country = RU
city = Нижний Новгород
Значит действительно дело в разрядности.

Осталось понять почему не работает ваш вариант. Может что неправильно в написании тут (выделено жирным)?
if(PHP_INT_SIZE > 4) {
if ($this->city['lat'] > $this->max_int) {
$this->city['lat'] |= 0xffffffff00000000;
}
if ($this->city['lon'] > $this->max_int) {
$this->city['lon'] |= 0xffffffff00000000;
}
}
Странник
 
Сообщения: 8
Зарегистрирован: 14.11.2012 10:21:11

Re: Проблемы с GEO

UNREAD_POST zapimir » 15.11.2012 17:27:38

Да в PHP масса веселых багов ловится в связи с разрядностью, потестим.
zapimir
Site Admin
 
Сообщения: 1628
Зарегистрирован: 01.10.2009 22:39:52

Re: Проблемы с GEO

UNREAD_POST Странник » 15.11.2012 19:24:17

Обратил внимание, что cc и country сдвинулось на 1.
Странник
 
Сообщения: 8
Зарегистрирован: 14.11.2012 10:21:11

Re: Проблемы с GEO

UNREAD_POST Странник » 17.11.2012 14:26:01

С базой SxGeo_GLCity.dat всё работает на обоих серверах. Пока остановился на ней.
Странник
 
Сообщения: 8
Зарегистрирован: 14.11.2012 10:21:11

Re: Проблемы с GEO

UNREAD_POST Странник » 02.01.2013 22:42:02

Новости появились? А то указанная база даёт ошибки при определении ertelecom
Странник
 
Сообщения: 8
Зарегистрирован: 14.11.2012 10:21:11

Re: Проблемы с GEO

UNREAD_POST zapimir » 10.01.2013 01:37:08

На подходе новый релиз базы, протестим в нем.
zapimir
Site Admin
 
Сообщения: 1628
Зарегистрирован: 01.10.2009 22:39:52


Вернуться в Проблемы и баги

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 10

Яндекс.Метрика