Все таки существует какое то общее информационное пространство идей. То, что носится в воздухе и завладевает умами. В канун нового года решение данной задачи понадобилось как минимум в трех проектах.
В связи с чем, мною был найден проект, созданный при поддержке Ру-центра, IpGeoBase. Здесь для веб-мастеров предлагается не затейлевый, но очень полезный xml-сервис. Авторы заявляют, что база пополняется буквально каждый день и позволяет получить информацию по заданному ip адресу с точностью до города.
Ниже я предлагаю вашему вниманию кусочек кода, использующий этот сервис.
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 |
/* вспомогательная процедура, позволяет выполнить post запрос через curl @url - строка http запроса @posts - массив параметров запроса */ function curl_post_query($url, $posts=array()) { $curl = curl_init(); $data = ''; foreach ($posts as $k=>$v) $data .= $k . '=' . urlencode($v) . '&' ; curl_setopt_array ($curl, array ( CURLOPT_HEADER => 0, CURLOPT_RETURNTRANSFER => 1, CURLOPT_URL => $url, CURLOPT_POST => 1, CURLOPT_POSTFIELDS => $data, )); return curl_exec ($curl); } /* на входе - строковое значение ip адреса, на выходе - набор параметров, описывающих географию этого ip-адреса */ function get_city($ip) { //здесь можно организовать обращение в кеш, например как то так: $res = db_query("SELECT * FROM geo_city WHERE ip = '%s'", $ip); if (mysql_num_rows($res)) return db_fetch_array($res); //подготовка данных для запроса и обращение к сервису ipGeoBase средствами curl $request = '' . $ip . ''; $rez = curl_post_query('http://194.85.91.253:8090/geo/geo.html', array('address' => $request)); //далее мы разбираем XML в массив $data, каким-либо привычным нам способом $data = ... //если сервису не удалось выполнить наш запрос, то в ответ приходит сообщение об ошибке //а если сообщения нет, то все ок if (empty($data['MESSAGE'])) //пишем кеш, как то так: db_query("REPLACE geo_city (ip, geo_city, geo_region, geo_area) VALUES ('%s', '%s', '%s', '%s')", $ip, $data['CITY'], $data['REGION'], $data['DISTRICT']); //и возвращаем результат запроса, в таком, например, виде //(ip, название города, название области, край или округ): return array('ip' => $ip, 'geo_city' => $data['CITY'], 'geo_region' => $data['REGION'], 'geo_area' => $data['DISTRICT']); } |
Видно, что буквально несколько строк кода решают нашу задачу, благодаря данному сервису. При желании можно решить ряд сопутствующих задач, вроде работы с кешем запросов. Работа с базой данных выполнена в данном примере в приложении к drupal. Возможно, не стоило захламлять код кешированием и лишними комментариями. А возможно, это послужит отправной точкой к обсуждению данного примера. ;)