23

We're looking for a fast and accurate way to get the visitors location based on their IP.

We have tried ipinfodb.com but their API made our website severely lag when making the API call.

What other services do you suggest?

hakre
  • 193,403
  • 52
  • 435
  • 836
Latox
  • 4,655
  • 15
  • 48
  • 74
  • Possible Duplicate: [What services exist that geo-locates a person based on IP?](http://stackoverflow.com/questions/464142/what-services-exist-that-geo-locates-a-person-based-on-ip) – hakre Oct 14 '11 at 11:41
  • possible duplicate of [Get Country of IP Address with PHP](http://stackoverflow.com/questions/3650006/get-country-of-ip-address-with-php) – Juraj Blaho Sep 02 '13 at 11:56
  • A free and easy to use API : https://ipinfodb.com/api – Milad Safaei May 04 '20 at 18:56

4 Answers4

38

Get Geo-IP Information

Requests a geo-IP-server (netip.de) to check, returns where an IP is located (host, state, country, town).

<?php
       $ip='94.219.40.96';
       print_r(geoCheckIP($ip));
       //Array ( [domain] => dslb-094-219-040-096.pools.arcor-ip.net [country] => DE - Germany [state] => Hessen [town] => Erzhausen )

       //Get an array with geoip-infodata
       function geoCheckIP($ip)
       {
               //check, if the provided ip is valid
               if(!filter_var($ip, FILTER_VALIDATE_IP))
               {
                       throw new InvalidArgumentException("IP is not valid");
               }

               //contact ip-server
               $response=@file_get_contents('http://www.netip.de/search?query='.$ip);
               if (empty($response))
               {
                       throw new InvalidArgumentException("Error contacting Geo-IP-Server");
               }

               //Array containing all regex-patterns necessary to extract ip-geoinfo from page
               $patterns=array();
               $patterns["domain"] = '#Domain: (.*?)&nbsp;#i';
               $patterns["country"] = '#Country: (.*?)&nbsp;#i';
               $patterns["state"] = '#State/Region: (.*?)<br#i';
               $patterns["town"] = '#City: (.*?)<br#i';

               //Array where results will be stored
               $ipInfo=array();

               //check response from ipserver for above patterns
               foreach ($patterns as $key => $pattern)
               {
                       //store the result in array
                       $ipInfo[$key] = preg_match($pattern,$response,$value) && !empty($value[1]) ? $value[1] : 'not found';
               }

               return $ipInfo;
       }

?>
DarkMukke
  • 2,469
  • 1
  • 23
  • 31
David Croft
  • 404
  • 4
  • 6
  • 1
    This is nice, but I'd prefer a database as our website receives thousands of requests and the geo IP request will be made per page load. – Latox Oct 14 '11 at 11:51
  • 2
    @latox i just updated my question, take a look at that link should be what you're after nomsayn? – David Croft Oct 14 '11 at 11:53
  • @Latox - If you maintain a local cache with the results of your API calls then you only have to pay the overhead of an API call for each new IP address. But the DB in the above link seems perfect for your application, as long as you don't need up-to-the-minute accuracy. – Peter Oct 14 '11 at 12:17
  • hey, did you know the terms of use for this site? such as max query per day/hour, licensing agreement... i can't seem to find it in its page..TIA :D – Kelvin Barsana Oct 08 '14 at 09:24
  • That post on PHPANDSTUFF is full of bogus comments, and relies on a regularly updated DB. Not useful at all. Where is a universal API that can retrieve this data asynchronously? – 3Dom Jan 28 '15 at 12:22
  • What are the usages limit if i use this API, Because my website has lots of user and i want to find their location by their IP address – Nilesh Kumar Oct 23 '15 at 11:20
  • @DavidCroft how can i add the country and the town in the database ?? – mhmd Sep 29 '16 at 12:26
  • As of June 1, 2020, this method no longer works. I have been using this method for many years, but now I'm getting "Error contacting Geo-IP-Server" on all requests. – Michael Yaeger Jul 20 '20 at 16:16
4

The best and latest is GeoplugginAPI its free and no limitations i am used for this my website http://spidersoft.in for location based download read more from this link

http://geoplugin.com

jacob justin
  • 156
  • 1
  • 5
3

Try this one http://ip.codehelper.io/

Here is PHP code. The code will caching your request automatic, so your server will not send multiple request. Return IP Address, Country, City and more information.

<?php
// Required Libraries
require_once("ip.codehelper.io.php");
require_once("php_fast_cache.php");

// New Class
$_ip = new ip_codehelper();

// Detect Real IP Address & Location
$real_client_ip_address = $_ip->getRealIP();
$visitor_location       = $_ip->getLocation($real_client_ip_address);

// Output result
echo $visitor_location['Country']."";
echo "<pre>";
print_r($visitor_location);
Ken Le
  • 1,787
  • 2
  • 22
  • 34
2

The market leader in this space and one that provides an enterprise solution is Digital Element. They offer a wide array of APIs, including PHP, to access their server which you can install locally or access via a web service. Their data is of high quality and the performance of their solution is quite good. MaxMind is another option as well that receives good reviews.

For the best accuracy, you'll want to opt for a service or solution where you get weekly update(s) as this stuff can change quite a bit within a given network. Cost will depend on the frequency of updates, granularity of the geo data, and the number of additional fields or databases you want. Some providers offer language, demographics, company, and domain to name a few.

RC.
  • 27,409
  • 9
  • 73
  • 93