ipv4-yii2

IP v4 中国城市地址库 Yii2 组件

  • Owner: larryli/ipv4-yii2
  • Platform:
  • License:: MIT License
  • Category::
  • Topic:
  • Like:
    0
      Compare:

Github stars Tracking Chart

IPv4 Yii2 组件

通过 composer 安装

composer require larryli/ipv4-yii2

配置 ipv4 组件和命令

别名

可以在 config 文件先定义一个别名:

Yii::setAlias('@ipv4-yii2', dirname(__DIR__) . '/vendor/larryli/ipv4-yii2');

组件

components 中增加:

// ipv4 component
'ipv4' => [
    'class' => '\larryli\ipv4\yii2\IPv4',
    // 'db' => 'db',
    // 'database' => '\larryli\ipv4\yii2\Database',
    // 'prefix' => 'ipv4_',
    'providers' => [
        'monipdb' => [
            // 'class' => '\larryli\ipv4\MonipdbQuery',
            'filename' => '@runtime/17monipdb.dat',
        ],
        'qqwry' => [
            // 'class' => '\larryli\ipv4\QqwryQuery',
            'filename' => '@runtime/qqwry.dat',
        ],
        'full' => [
            // 'class' => '\larryli\ipv4\FullQuery',
            'providers' => ['monipdb', 'qqwry'], // ex. 'monipdb', 'qqwry', ['qqwry', 'monipdb']
        ],
        'mini' => [
            // 'class' => '\larryli\ipv4\MiniQuery',
            'providers' => 'full',   // ex. ['monipdb', 'qqwry'], 'monipdb', 'qqwry', ['qqwry', 'monipdb']
        ],
        'china' => [
            // 'class' => '\larryli\ipv4\MiniQuery',
            'providers' => 'full',
        ],
        'world' => [
            // 'class' => '\larryli\ipv4\MiniQuery',
            'providers' => 'full',
        ],
        'freeipip' => [
            // 'class' => '\larryli\ipv4\FreeipipQuery',
        ],
        // 'taobao' => [
            // 'class' => '\larryli\ipv4\TaobaoQuery',
        // ],
        // 'sina' => [
            // 'class' => '\larryli\ipv4\SinaQuery',
        // ],
        // 'BaiduMap' => [
            // 'class' => '\larryli\ipv4\BaidumapQuery',
        // ],
    ],
],

其中:

  • class 指向组件自身;
  • db 可用的 yii2 数据库连接,默认为 Yii::$app->db
  • database 指向特定的 Database 类,默认使用 \larryli\ipv4\yii2\Database
  • prefix 为数据库表前缀,默认为 ipv4_
  • providers 配置可用的 \larryli\ipv4\Query 数据源;
    • class 数据源可以指定具体的类;
    • filename ,对于 \larryli\ipv4\FileQuery 需指定文件路径,其内容可以用别名,如 @runtime/foo.dat
    • providers 数据源的数据源,\larryli\ipv4\DatabaseQuery 需要,可以为一个或多个;其中第一个为主数据源,其他是备选,按照定义顺序依次选用;

命令

config 数组中增加 controllerMap 配置内容:

// ipv4 command
'ipv4' => [
    'class' => 'larryli\ipv4\yii2\commands\Ipv4Controller',
],

使用:

./yii help ipv4

可以查看 ipv4 命令列表。

数据库迁移

复制数据库迁移脚本到当前 @app/migrations 下:

cp vendor/larryli/ipv4-yii2/migrations/*.php migrations/

或者参见此页面的说明使用其他的方式处理。

然后,执行迁移:

./yii migrate/up

初始化

./yii ipv4/init

查询

./yii ipv4/query 127.0.0.1

杂项

./yii ipv4/benchmark        # 性能测试
./yii ipv4/clean            # 清除全部数据
./yii ipv4/clean file       # 清除下载的文件数据
./yii ipv4/clean database   # 清除生成的数据库数据
./yii ipv4/dump             # 导出原始数据
./yii ipv4/dump division    # 导出排序好的全部地址列表
./yii ipv4/dump division_id # 导出排序好的全部地址和猜测行政区域代码列表

注意:dump 命令会耗费大量内存,请配置 PHP memory_limit 至少为 256M 或更多。

代码调用

使用组件

use Yii;
Yii::$app->get('ipv4')->getQuery('full')->find(ip2long('127.0.0.1'));
Yii::$app->get('ipv4')->__get('full')->find(ip2long('127.0.0.1'));
Yii::$app->ipv4->full->find(ip2long('127.0.0.1'));

foreach (Yii::$app->ipv4->getQueries() as $query) {
    $query->find(ip2long('127.0.0.1'));
}

使用模型

仅支持生成的数据库 larryli\ipv4\DatabaseQuery 查询。

使用 yii2 模型可以不需要配置 ipv4 组件,但必须先使用 ipv4 组件生成好相关数据库。

也就是说,可以只在 console 应用中配置 ipv4 组件;然后在 web 应用中配置 ipv4 组件直接使用相关模型。

Division 模型

namespace app\models;

use larryli\ipv4\yii2\models\Division as BaseDivision;

/**
 * Class Division
 * @package app\models
 */
class Division extends BaseDivision
{
    /**
     * @inheritdoc
     */
    public static function tableName()
    {
        return "{{%ipv4_divisions}}";
    }
}

使用 tableName 静态方法可以重载掉父类中调用组件查询 prefix 的代码。

Full/Mini/China/World 模型

namespace app\models;

use larryli\ipv4\yii2\models\Index;

/**
 * Class Full
 * @package app\models
 *
 * @property string $ip
 * @property Division $division
 */
class Full extends Index
{
    /**
     * @return string
     */
    static public function divisionClassName()
    {
        return Division::className();
    }
    
    /**
     * @inheritdoc
     */
    public static function tableName()
    {
        return '{{%ipv4_full}}';
    }
}

使用 divisionClassName 静态方法可以重载掉 Division 父类中调用组件查询 prefix 的代码。

仅需要声明所需使用的查询模型即可。

查询:

$model = Full::findOneByIp(ip2long('127.0.0.1'));
if (!empty($model) && !empty(!$model->division)) {
    echo $model->division->name;
}

相关包

Main metrics

Overview
Name With Ownerlarryli/ipv4-yii2
Primary LanguagePHP
Program languagePHP (Language Count: 1)
Platform
License:MIT License
所有者活动
Created At2015-09-16 03:02:07
Pushed At2016-05-31 14:21:54
Last Commit At2016-05-31 22:20:50
Release Count9
Last Release Name1.1.1 (Posted on 2016-05-31 22:21:38)
First Release Name1.0.0-alpha (Posted on )
用户参与
Stargazers Count3
Watchers Count1
Fork Count0
Commits Count21
Has Issues Enabled
Issues Count0
Issue Open Count0
Pull Requests Count3
Pull Requests Open Count0
Pull Requests Close Count0
项目设置
Has Wiki Enabled
Is Archived
Is Fork
Is Locked
Is Mirror
Is Private