Для определение на стороне клиента в JS можно использовать
Sypex Geo API, и получать данные в JSON или JSONP. Для PHP можно там же скачать базу, либо тоже из PHP обращаться к API, чтобы не заморачиваться с обновлениями. Что конкретно выбрать зависит, в принципе от объемов, сколько вам IP нужно определять.