O site http://ipinfo.io/ disponibiliza uma API pública e gratuita (até 1000 requisições/dia) para consulta de geolocalização.
O funcionamento é bem simples, basta fazer uma requisição usando file_get_contents(), curl ou o que mais a imaginação desejar para o endreço http://ipinfo.io/XXX.XXX.XXX.XXX/json o retorno é em json então basta usar algum json parser pra trabalhar com os dados.
Exemplo:
curl ipinfo.io/8.8.8.8/geo { "ip": "8.8.8.8", "loc": "37.385999999999996,-122.0838", "city": "Mountain View", "region": "California", "country": "US", }
Dica do Giuseppe