pier-infor/geoliteip

Pier-Infor Geoliteip.

1.0.2 2019-11-08 12:13 UTC

This package is auto-updated.

Last update: 2024-09-09 00:22:07 UTC


README

TravsisBadgeBuild Coverage ScrutinizerScore Latest Stable Version Total Downloads Latest Unstable Version

Geoliteip 是一个 php 工具,用于使用和管理 MaxMind GeoLite2 免费数据库(mmdb 格式)。

🌊 特性

  • 使用 3 个免费数据库:asn、国家、城市。
  • 动态更改数据库,无需重新实例化。
  • 从纯文本文件输入 IP 列表。
  • 输出为数组、json、csv。
  • 动态更新数据库或通过 composer。

👍 优点

  • 使用工厂/适配器模式实现灵活性和可扩展性。
  • 注释并全面测试。
  • 通过覆盖/添加适配器可以简单地更改行为。
  • 所有常量类均集中位于 src/Interfaces 中,可以覆盖;

👎 缺点

  • 不使用非免费的 GeoLite 数据库(但可以扩展以完成任务)。

👷 依赖

  • geoip2/geoip2

😇 测试 & 覆盖率

  • 在运行测试之前安装数据库,执行以下操作:
composer run db
  • 需要 xdebug 以启用覆盖率。
  • 所有测试通过,PHP 版本 >= 7.0。
  • /!\ 更新器测试会从 MaxMind 进行真实数据库更新,滥用会导致 503 错误。

Composer

设施运行

  • db(下载并安装 assets db 中的数据库)。
  • test(通过所有测试)。
  • coverage(通过所有测试并带有覆盖率)。
  • testIp(仅运行 IpTest)。
  • testDownloader(仅运行 DownloaderTest)。
  • testFileManager(仅运行 FileManagerTest)。
  • testUpdater(仅运行 UpdaterTest)。
  • lint(检查并修复源代码错误)。

集成

最佳方式是使用 composer

composer require pier-infor/geoliteip

要集成 postInstall 进程,请按以下方式调整您的 composer.json。

"scripts": {
    ...
    "post-install-cmd": [
        ...
        "PierInfor\\GeoLite\\Installer::postInstall"
    ]
}

虚拟应用程序

从项目根目录创建一个 src 文件夹,然后在其中创建一个名为 app.php 的文件。

将以下代码复制粘贴到 app.php 中

<?php

namespace Company\MyApp;

use PierInfor\GeoLite\Ip;

error_reporting(E_ALL);
ini_set('display_errors', 1);
ini_set('log_errors', 1);
ini_set('date.timezone', 'Europe/Paris');
ini_set('register_globals', 0);
ini_set('opcache.enable', 0);

if (function_exists('opcache_get_configuration')) {
    ini_set('opcache.memory_consumption', 128);
    ini_set('opcache.load_comments', true);
}

require_once 'vendor/autoload.php';

$geoInst = new Ip();
$forceUpdate = false;
echo 'Begin update @' . microtime(true) . "\n";
$geoInst
    ->setAdapter(Ip::ADAPTER_ASN)->update($forceUpdate)
    ->setAdapter(Ip::ADAPTER_COUNTRY)->update($forceUpdate)
    ->setAdapter(Ip::ADAPTER_CITY)->update($forceUpdate);
echo 'End   update @' . microtime(true) . "\n";
$ipv6ToCheck = '2a01:e35:2422:4d60:2ad2:44ff:fe06:2983';
$ipv4ToCheck = '82.66.36.214';
echo 'Scanning ipv6 ' . $ipv6ToCheck . "\n";
echo 'Scanning ipv4 ' . $ipv4ToCheck . "\n";
$geoInst->addIp($ipv6ToCheck);
$geoInst->addIp($ipv4ToCheck);
echo $geoInst->process()->toJson();
unset($geoInst);

从项目根目录运行

php ./src/app.php

应该立即无错误显示以下消息

Begin update @1568318808.9869
End   update @1568318808.9871
Scanning ipv6 2a01:e35:2422:4d60:2ad2:44ff:fe06:2983
Scanning ipv4 82.66.36.214
[
    {
        "ip": "2a01:e35:2422:4d60:2ad2:44ff:fe06:2983",
        "country": "FR",
        "city": "?",
        "lon": 48.85,
        "lat": 2.5,
        "radius": 10
    },
    {
        "ip": "82.66.36.214",
        "country": "FR",
        "city": "Aubervilliers",
        "lon": 48.9163,
        "lat": 2.3869,
        "radius": 5
    }
]

将 forceUpdate 设置为 true 将在静默模式下强制更新。

您可以通过将 ipv4 更改为 ipv6 来检查同一位置的准确性。

🐹 待办事项

  • 实现输入参数以读取 stdin。
  • 找到一个好的 php 文档生成器...