根据站点或应用程序,查找与 IP 地址相关的地理信息可能是一种非常常见的操作。 在 PHP 中进行 IP 地理定位时,通常会使用 PHP GeoIP 扩展来帮助检索此信息。 不幸的是,这个特定的插件不再受到积极支持,并且多年来没有更新。
随着有效地弃用 IP 地理定位的首选 PHP 扩展,新项目应该开始使用 MaxMind 现在提供的替代选项。 但是,与作为原生 PHP 扩展发布的原始 GeoIP 不同,新解决方案以基于 PHP 的库包的形式提供。
要求
- 要使用 Composer 包,必须对 PHP 编码有基本的了解。
- 遵循本教程可能需要通过 SSH 进行命令行访问。
- Composer、Curl、funzip 必须在服务器上可用。
第 1 步:我现在有哪些选择?
如前所述,新选项不再作为原生 PHP 扩展提供,而是作为基于 Composer 的 PHP 包提供。 MaxMind 提供的新选项是: GeoIP2-php 或者 DB-Reader-php.
这两个选项都提供了 IP 地理定位的能力,但有细微的差别; 从某种意义上说,GeoIP2-php 包是建立在 DB-Reader-php 包之上的附加功能,它提供了与 DB-Reader-php 相同的所有功能,并增加了 API 访问权限。
此外,需要注意的是,仅提供 DB-Reader 选项,无需任何额外费用。 有了新选项,MaxMind 现在收取订阅费才能访问他们的 API。
通常对于大多数用例,必要的功能将由 DB-Reader-php 包提供,因此本文将重点介绍此选项。
第 2 步:开始使用 MaxMind DB-Reader!
如要求中所述,需要 Composer 才能执行这些步骤。 如果您还没有准备好使用 Composer,请了解如何在您的服务器上设置和使用 Composer。
要获取必要的 DB-Reader 包,您需要首先更改目录,以便您位于域的根文件夹中(对于本示例,我们假设这是 `public_html`),然后运行以下命令。
[public_html] $ composer require maxmind-db/reader:~1.0
运行此命令会将包文件下载到当前文件夹中,如我们的 Composer 系列中所述。 如果这是第一次在此站点/项目中使用 Composer,这将创建一个供应商文件夹。
接下来,您将需要包含地理位置数据的实际 MaxMind 数据库文件。 要获取这些文件,您将执行以下命令。
[public_html] $ funzip <(curl -L https://geolite.maxmind.com/download/geoip/database/GeoLite2-Country.mmdb.gz) > ./GeoLite2-Country.mmdb [public_html] $ funzip <(curl -L https://geolite.maxmind.com/download/geoip/database/GeoLite2-City.mmdb.gz) > ./GeoLite2-City.mmdb
执行上述命令后,您现在应该拥有使用 DB-Reader 插件进行地理定位所需的组件。 剩下的就是在您的代码中实现它。
第 3 步:查找您的第一个 IP
为了确保地理定位功能正常工作,您可能需要进行快速测试。 首先,我们将通过运行以下命令来确认您拥有所有正确的部分。
$ ls -lah
您应该会看到与此类似的文件结构。
-rw-rw-r-- 1 someuser someuser 63 Aug 11 17:03 composer.json -rw-rw-r-- 1 someuser someuser 2.4K Aug 11 17:03 composer.lock -rw-rw-r-- 1 someuser someuser 73M Aug 11 17:04 GeoLite2-City.mmdb -rw-rw-r-- 1 someuser someuser 19M Aug 11 17:04 GeoLite2-Country.mmdb drwxrwxr-x 4 someuser someuser 4.0K Aug 11 17:03 vendor/
现在您已准备好进行快速测试,您可以通过创建包含以下内容的 index.php 文件来实现。
<?php require_once 'vendor/autoload.php'; use MaxMindDbReader; $ipAddress="8.8.8.8"; $databaseFile="./GeoLite2-City.mmdb"; $reader = new Reader($databaseFile); print_r($reader->get($ipAddress)); $reader->close();
该索引文件将简单地进行快速测试,以确保正在加载数据库文件、可以检查 IP 并提供结果。 测试将在 8.8.8.8 查找与 Google 的 DNS 服务器相关的地理信息。
正确遵循指示后,您应该在加载测试索引页面时看到类似于上图的输出。