PHPackages                             gpslab/geoip2 - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. gpslab/geoip2

ActiveSymfony-bundle[Utility &amp; Helpers](/categories/utility)

gpslab/geoip2
=============

A Symfony Bundle for the Maxmind GeoIP2 API

v2.1.3(1y ago)541.5M—8.4%13[9 issues](https://github.com/gpslab/geoip2/issues)3MITPHPPHP &gt;=7.2.0CI failing

Since Jan 24Pushed 1y ago5 watchersCompare

[ Source](https://github.com/gpslab/geoip2)[ Packagist](https://packagist.org/packages/gpslab/geoip2)[ Docs](https://github.com/gpslab/geoip2)[ RSS](/packages/gpslab-geoip2/feed)WikiDiscussions master Synced 1mo ago

READMEChangelog (10)Dependencies (10)Versions (31)Used By (3)

[![Latest Stable Version](https://camo.githubusercontent.com/23c919267c06819ee0dfe51fabd5a01f097517a040e1f12552a6e08e708f0124/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f762f6770736c61622f67656f6970322e7376673f6d61784167653d33363030266c6162656c3d737461626c65)](https://packagist.org/packages/gpslab/geoip2)[![Test](https://github.com/gpslab/geoip2/actions/workflows/test.yaml/badge.svg)](https://github.com/gpslab/geoip2/actions/workflows/test.yaml)[![Coverage Status](https://camo.githubusercontent.com/73174f94f59e0928a26ed91361baf5fd20ba6c3dffbd589614c444db3346ac67/68747470733a2f2f696d672e736869656c64732e696f2f636f766572616c6c732f6770736c61622f67656f6970322e7376673f6d61784167653d33363030)](https://coveralls.io/github/gpslab/geoip2?branch=master)[![Scrutinizer Code Quality](https://camo.githubusercontent.com/7b6f6216cc176d604c57c6670ae295bbb8309b26c23bf3069afc8b257ec20d18/68747470733a2f2f696d672e736869656c64732e696f2f7363727574696e697a65722f672f6770736c61622f67656f6970322e7376673f6d61784167653d33363030)](https://scrutinizer-ci.com/g/gpslab/geoip2/?branch=master)[![License](https://camo.githubusercontent.com/c1b304d23c406f9824c0b3eb2ff68f9d152bc40eb22195ae0d4e39b28de88a46/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f6c2f6770736c61622f67656f6970322e7376673f6d61784167653d33363030)](https://github.com/gpslab/geoip2)

A Symfony Bundle for the Maxmind GeoIP2 API
===========================================

[](#a-symfony-bundle-for-the-maxmind-geoip2-api)

Bundle for use [maxmind/GeoIP2](https://github.com/maxmind/GeoIP2-php) in Symfony.

Installation
------------

[](#installation)

Pretty simple with [Composer](http://packagist.org), run:

```
composer req gpslab/geoip2
```

Configuration
-------------

[](#configuration)

To configure auto-update the database you need to generate your personal licence key.

#### Steps for generate licence key

[](#steps-for-generate-licence-key)

1. [Sign up for a MaxMind account](https://www.maxmind.com/en/geolite2/signup) (no purchase required)
2. Login and generate a [licence key](https://www.maxmind.com/en/accounts/current/license-key)
3. Save your licence key
4. Open [download page](https://www.maxmind.com/en/download_files) and find your needed DB edition `ID` and copy value from first column.

Example configuration:

```
gpslab_geoip:
    # Your personal licence key
    license: 'XXXXXXXXXXXXXXXX'

    # One of database edition IDs:
    #   GeoLite2-ASN
    #   GeoLite2-City
    #   GeoLite2-Country
    #   GeoIP2-City
    #   GeoIP2-Country
    #   GeoIP2-Anonymous-IP
    #   GeoIP2-Domain
    #   GeoIP2-ISP
    edition: 'GeoLite2-City'
```

#### Database source URL

[](#database-source-url)

By default, this URL is used to download a new databases `https://download.maxmind.com/app/geoip_download?edition_id={edition_id}&license_key={license_key}&suffix=tar.gz`

- `edition_id` - character ID name from first column on [download page](https://www.maxmind.com/en/download_files);
- `license_key` - your personal [licence key](https://www.maxmind.com/en/accounts/current/license-key).

You can change this URL, for example, if you want to use a proxy to download the database. You can customize the source URL in the configuration.

```
gpslab_geoip:
    license: 'XXXXXXXXXXXXXXXX'
    edition: 'GeoLite2-City'
    url: 'https://example.com/GeoLite2-City.tar.gz'
```

### Target download path

[](#target-download-path)

By default, new databases downloaded in `%kernel.cache_dir%/{edition_id}.mmdb`, where `edition_id` is a character ID name from first column on [download page](https://www.maxmind.com/en/download_files). That is, by default, the new database will be downloaded into folder `var/cache/{env}/`. Keeping the database in the cache folder for each environment may not be optimal. You can choose a common directory for all environments.

```
gpslab_geoip:
    license: 'XXXXXXXXXXXXXXXX'
    edition: 'GeoLite2-City'
    path: '%kernel.project_dir%/var/GeoLite2-City.mmdb'
```

#### Localization

[](#localization)

By default, the English locale is used for GeoIP record. You can change the locale for record and declare multiple locales for fallback.

```
gpslab_geoip:
    license: 'XXXXXXXXXXXXXXXX'
    edition: 'GeoLite2-City'
    locales: [ 'ru', 'en' ]
```

Usage
-----

[](#usage)

You can get GeoIP2 reader service:

```
use GeoIp2\Database\Reader;

// get a GeoIP2 reader
$reader = $this->get(Reader::class);
// or
//$reader = $this->get('geoip2.reader');

// get a GeoIP2 City model
$record = $reader->city('128.101.101.101');

print($record->country->isoCode . "\n"); // 'US'
print($record->country->name . "\n"); // 'United States'
print($record->country->names['zh-CN'] . "\n"); // '美国'

print($record->mostSpecificSubdivision->name . "\n"); // 'Minnesota'
print($record->mostSpecificSubdivision->isoCode . "\n"); // 'MN'

print($record->city->name . "\n"); // 'Minneapolis'

print($record->postal->code . "\n"); // '55455'

print($record->location->latitude . "\n"); // 44.9733
print($record->location->longitude . "\n"); // -93.2323
```

For more example see the [GeoIP2](https://github.com/maxmind/GeoIP2-php) library.

Multiple databases
------------------

[](#multiple-databases)

You can use multiple GeoIP databases in one application. Need update configuration file.

```
gpslab_geoip:
    databases:
        default:
            license: 'XXXXXXXXXXXXXXXX'
            edition: 'GeoLite2-City'
        country:
            license: 'XXXXXXXXXXXXXXXX'
            edition: 'GeoLite2-Country'
        asn:
            license: 'XXXXXXXXXXXXXXXX'
            edition: 'GeoLite2-ASN'
```

Using in application:

```
// get a GeoIP2 reader for City database
$default_reader = $this->get('geoip2.database.default_reader');
// or
//$default_reader = $this->get(Reader::class);
// or
//$default_reader = $this->get('geoip2.reader');

// get a GeoIP2 reader for Country database
$country_reader = $this->get('geoip2.database.country_reader');

// get a GeoIP2 reader for ASN database
$asn_reader = $this->get('geoip2.database.asn_reader');
```

You can rename the default database.

```
gpslab_geoip:
    default_database: 'city'
    databases:
        asn:
            license: 'XXXXXXXXXXXXXXXX'
            edition: 'GeoLite2-ASN'
        city:
            license: 'XXXXXXXXXXXXXXXX'
            edition: 'GeoLite2-City'
        country:
            license: 'XXXXXXXXXXXXXXXX'
            edition: 'GeoLite2-Country'
```

```
// get a GeoIP2 reader for City database
$default_reader = $this->get('geoip2.database.city_reader');
// or
//$default_reader = $this->get(Reader::class);
// or
//$default_reader = $this->get('geoip2.reader');
```

In order not to repeat the license key and locales for each database, you can specify them once.

```
gpslab_geoip:
    license: 'XXXXXXXXXXXXXXXX' # global license
    locales: [ 'ru', 'en' ] # global locales
    default_database: 'city'
    databases:
        asn:
            edition: 'GeoLite2-ASN'
            locales: [ 'fr' ] # customize locales
        city:
            edition: 'GeoLite2-City'
            url: 'https://example.com/GeoLite2-City.tar.gz' # customize url
            path: '%kernel.project_dir%/var/GeoLite2-City.mmdb' # customize path
        country:
            edition: 'GeoLite2-Country'
            license: 'YYYYYYYYYYYYYYYY' # customize license
```

### GeoIP data in client locale

[](#geoip-data-in-client-locale)

If you want to show the GeoIP data to the user and show them in the user locale, then you can use the reader factory.

```
use GpsLab\Bundle\GeoIP2Bundle\Reader\ReaderFactory;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;

class GeoIPController
{
    public function index(Request $request, ReaderFactory $factory): Response
    {
        $client_locale = $request->getLocale();
        $client_ip = $request->getClientIp();
        $database_name = 'default';
        $fallback_locale = 'en';

        $reader = $factory->create($database_name, [$client_locale, $fallback_locale]);
        $record = $reader->city($client_ip);

        return new Response(sprintf('You are from %s?', $record->country->name));
    }
}
```

Console commands
----------------

[](#console-commands)

### Update GeoIP database

[](#update-geoip-database)

Execute console command for update all databases:

```
php bin/console geoip2:update

```

If you use multiple databases, then for config:

```
gpslab_geoip:
    # ...
    databases:
        asn:
            # ...
        city:
            # ...
        country:
            # ...
```

You can update several databases:

```
php bin/console geoip2:update city country

```

Optionally installing splitbrain/php-archive uses significantly less memory when updating a database and can avoid out of memory errors:

```
composer req splitbrain/php-archive

```

### Download GeoIP database

[](#download-geoip-database)

You can download custom database with console command:

```
php bin/console geoip2:download https://example.com/GeoLite2-City.tar.gz /path/to/GeoLite2-City.mmdb

```

License
-------

[](#license)

This bundle is under the [MIT license](http://opensource.org/licenses/MIT). See the complete license in the file: LICENSE

###  Health Score

51

—

FairBetter than 96% of packages

Maintenance40

Moderate activity, may be stable

Popularity53

Moderate usage in the ecosystem

Community26

Small or concentrated contributor base

Maturity69

Established project with proven stability

 Bus Factor1

Top contributor holds 91.4% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~100 days

Total

30

Last Release

479d ago

Major Versions

1.2.x-dev → v2.0.02020-02-04

PHP version history (3 changes)v1.0.0PHP &gt;=5.4.0

v2.0.0PHP &gt;=7.1.0

v2.1.0PHP &gt;=7.2.0

### Community

Maintainers

![](https://www.gravatar.com/avatar/9a6415c83577efe7b70d9ae4a3bb12958adc11c16e530ff844ff217b0fd0c54a?d=identicon)[Peter Gribanov](/maintainers/Peter%20Gribanov)

---

Top Contributors

[![peter-gribanov](https://avatars.githubusercontent.com/u/1954436?v=4)](https://github.com/peter-gribanov "peter-gribanov (287 commits)")[![Lustmored](https://avatars.githubusercontent.com/u/2358046?v=4)](https://github.com/Lustmored "Lustmored (11 commits)")[![mreiden](https://avatars.githubusercontent.com/u/6321246?v=4)](https://github.com/mreiden "mreiden (5 commits)")[![antedebaas](https://avatars.githubusercontent.com/u/5467398?v=4)](https://github.com/antedebaas "antedebaas (3 commits)")[![Bukashk0zzz](https://avatars.githubusercontent.com/u/1908342?v=4)](https://github.com/Bukashk0zzz "Bukashk0zzz (3 commits)")[![Huluti](https://avatars.githubusercontent.com/u/5782198?v=4)](https://github.com/Huluti "Huluti (1 commits)")[![ChrisKinnan](https://avatars.githubusercontent.com/u/53341594?v=4)](https://github.com/ChrisKinnan "ChrisKinnan (1 commits)")[![classaxe](https://avatars.githubusercontent.com/u/9293057?v=4)](https://github.com/classaxe "classaxe (1 commits)")[![aalwash](https://avatars.githubusercontent.com/u/3220347?v=4)](https://github.com/aalwash "aalwash (1 commits)")[![jaimenj](https://avatars.githubusercontent.com/u/6050201?v=4)](https://github.com/jaimenj "jaimenj (1 commits)")

---

Tags

geoipmaxmindmaxmind-geoip2-apiphpsymfony-bundlesymfony-flex

###  Code Quality

TestsPHPUnit

Static AnalysisPHPStan

Type Coverage Yes

### Embed Badge

![Health badge](/badges/gpslab-geoip2/health.svg)

```
[![Health](https://phpackages.com/badges/gpslab-geoip2/health.svg)](https://phpackages.com/packages/gpslab-geoip2)
```

###  Alternatives

[symfony/maker-bundle

Symfony Maker helps you create empty commands, controllers, form classes, tests and more so you can forget about writing boilerplate code.

3.4k111.1M568](/packages/symfony-maker-bundle)[sylius/sylius

E-Commerce platform for PHP, based on Symfony framework.

8.4k5.6M651](/packages/sylius-sylius)[prestashop/prestashop

PrestaShop is an Open Source e-commerce platform, committed to providing the best shopping cart experience for both merchants and customers.

9.0k15.4k](/packages/prestashop-prestashop)[simplesamlphp/simplesamlphp

A PHP implementation of a SAML 2.0 service provider and identity provider.

1.1k12.4M193](/packages/simplesamlphp-simplesamlphp)[symplify/monorepo-builder

Not only Composer tools to build a Monorepo.

5205.3M82](/packages/symplify-monorepo-builder)[sulu/sulu

Core framework that implements the functionality of the Sulu content management system

1.3k1.3M152](/packages/sulu-sulu)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
