commit
9ad4a489a4
194
README.md
194
README.md
|
|
@ -1,90 +1,81 @@
|
|||
ip2region - 最自由的ip地址查询库,ip到地区的映射库,提供Binary,B树和纯内存三种查询算法,妈妈再也不用担心我的ip地址定位。
|
||||
# Ip2region是什么?
|
||||
|
||||
### 1. 99.9%准确率,定时更新:
|
||||
ip2region - 准确率99.9%的离线IP地址定位库,0.0x毫秒级查询,ip2region.db数据库只有数MB,提供了java,php,c,python,nodejs,golang,c#等查询绑定和Binary,B树,内存三种查询算法。
|
||||
|
||||
数据聚合了一些知名ip到地名查询提供商的数据,这些是他们官方的的准确率,经测试着实比纯真啥的准确多了。<br />
|
||||
每次聚合一下数据需要1-2天,会不定时更新。<br /><br />
|
||||
|
||||
|
||||
|
||||
# Ip2region特性
|
||||
|
||||
### 99.9%准确率
|
||||
|
||||
数据聚合了一些知名ip到地名查询提供商的数据,这些是他们官方的的准确率,经测试着实比经典的纯真IP定位准确一些。<br />
|
||||
ip2region的数据聚合自以下服务商的开放API或者数据(升级程序每秒请求次数2到4次): <br />
|
||||
01, >80%, 淘宝IP地址库, [http://ip.taobao.com/](http://ip.taobao.com/) <br />
|
||||
02, ≈10%, GeoIP, [https://geoip.com/](https://geoip.com/) <br />
|
||||
03, ≈2%, 纯真IP库, [http://www.cz88.net/](http://www.cz88.net/) <br />
|
||||
<b>备注:</b>如果上述开放API或者数据都不给开发时ip2region将停止数据的更新服务,目前是2~3个月更新一次。
|
||||
<b>备注:</b>如果上述开放API或者数据都不给开放数据时ip2region将停止数据的更新服务。
|
||||
|
||||
|
||||
### 2. 标准化的数据格式:
|
||||
### 标准化的数据格式
|
||||
|
||||
每条ip数据段都固定了格式:_城市Id|国家|区域|省份|城市|ISP_
|
||||
|
||||
只有中国的数据精确到了城市,其他国家只能定位到国家,后前的选项全部是0,已经包含了全部你能查到的大大小小的国家。
|
||||
(请忽略前面的城市Id,个人项目需求)
|
||||
|
||||
### 3. 体积小:
|
||||
|
||||
生成的数据库文件ip2region.db只有1.5M(1.2版本前是3.5M)
|
||||
|
||||
### 4. 多查询客户端的支持,0.0x毫秒级别的查询
|
||||
|
||||
已经集成的客户端有:java、C#、php、c、python、nodejs、php扩展(php5和php7)、golang、rust、lua、lua_c。
|
||||
|
||||
提供了两种查询算法,响应时间如下:
|
||||
客户端/binary算法/b-tree算法/Memory算法:
|
||||
c#/0.x毫秒/0.x毫秒/0.x毫秒
|
||||
java/0.x毫秒/0.x毫秒/0.1x毫秒 (使用RandomAccessFile)
|
||||
php/0.x毫秒/0.1x毫秒/0.1x毫秒
|
||||
c/0.0x毫秒/0.0x毫秒/0.00x毫秒(b-tree算法基本稳定在0.02x毫秒级别)
|
||||
python/0.x毫秒/0.1x毫秒/未知
|
||||
lua/0.x毫秒/0.x毫秒/0.x毫秒
|
||||
lua_c/0.0x毫秒/0.0x毫秒/0.00x毫秒
|
||||
|
||||
任何客户端b-tree都比binary算法快,当然Memory算法固然是最快的!
|
||||
|
||||
maven仓库地址:
|
||||
```xml
|
||||
<dependency>
|
||||
<groupId>org.lionsoul</groupId>
|
||||
<artifactId>ip2region</artifactId>
|
||||
<version>1.7.2</version>
|
||||
</dependency>
|
||||
每条ip数据段都固定了格式:
|
||||
```
|
||||
nuget安装命令
|
||||
```shell
|
||||
Install-Package IP2Region
|
||||
_城市Id|国家|区域|省份|城市|ISP_
|
||||
```
|
||||
|
||||
### 5. 测试程序:
|
||||
C#、Node.js、lua_c的测试请具体参考文件夹中README.md 说明。
|
||||
只有中国的数据精确到了城市,其他国家有部分数据只能定位到国家,后前的选项全部是0,已经包含了全部你能查到的大大小小的国家(请忽略前面的城市Id,个人项目需求)。
|
||||
|
||||
java:
|
||||
```shell
|
||||
cd binding/java
|
||||
ant all
|
||||
java -jar ip2region-{version}.jar ./data/ip2region.db
|
||||
```
|
||||
|
||||
php:
|
||||
```shell
|
||||
php binding/php/testSearcher.php ./data/ip2region.db
|
||||
```
|
||||
### 体积小
|
||||
|
||||
c:
|
||||
包含了全部的IP,生成的数据库文件ip2region.db只有几MB,最小的版本只有1.5MB,随着数据的详细度增加数据库的大小也慢慢增大,目前还没超过8MB。
|
||||
|
||||
|
||||
### 查询速度快
|
||||
|
||||
全部的查询客户端单次查询都在0.x毫秒级别,内置了三种查询算法
|
||||
|
||||
1. memory算法:整个数据库全部载入内存,单次查询都在0.1x毫秒内,C语言的客户端单次查询在0.00x毫秒级别。
|
||||
2. binary算法:基于二分查找,基于ip2region.db文件,不需要载入内存,单次查询在0.x毫秒级别。
|
||||
3. b-tree算法:基于btree算法,基于ip2region.db文件,不需要载入内存,单词查询在0.x毫秒级别,比binary算法更快。
|
||||
|
||||
任何客户端b-tree都比binary算法快,当然memory算法固然是最快的!
|
||||
|
||||
|
||||
### 多查询客户端的支持
|
||||
|
||||
已经集成的客户端有:java、C#、php、c、python、nodejs、php扩展(php5和php7)、golang、rust、lua、lua_c, nginx。
|
||||
|
||||
binding | 描述 | 开发状态 | binary查询耗时 | b-tree查询耗时 | memory查询耗时
|
||||
:-: | :-: | :-: | :-: | :-: | :-:
|
||||
[c](binding/c) | ANSC c binding | 已完成 | 0.0x毫秒 | 0.0x毫秒 | 0.00x毫秒
|
||||
[c#](binding/c#) | c# binding | 已完成 | 0.x毫秒 | 0.x毫秒 | 0.1x毫秒
|
||||
[golang](binding/golang) | golang binding | 已完成 | 0.x毫秒 | 0.x毫秒 | 0.1x毫秒
|
||||
[java](binding/java) | java binding | 已完成 | 0.x毫秒 | 0.x毫秒 | 0.1x毫秒
|
||||
[lua](binding/lua) | lua实现的binding | 已完成 | 0.x毫秒 | 0.x毫秒 | 0.x毫秒
|
||||
[lua_c](binding/lua_c) | lua的c扩展 | 已完成 | 0.0x毫秒 | 0.0x毫秒 | 0.00x毫秒
|
||||
[nginx](binding/nginx) | nginx的c扩展 | 已完成 | 0.0x毫秒 | 0.0x毫秒 | 0.00x毫秒
|
||||
[nodejs](binding/nodejs) | nodejs | 已完成 | 0.x毫秒 | 0.x毫秒 | 0.1x毫秒
|
||||
[php](binding/php) | php实现的binding | 已完成 | 0.x毫秒 | 0.1x毫秒 | 0.1x毫秒
|
||||
[php5_ext](binding/php5_ext) | php5的c扩展 | 已完成 | 0.0x毫秒 | 0.0x毫秒 | 0.00x毫秒
|
||||
[php7_ext](binding/php7_ext) | php7的c扩展 | 已完成 | 0.0毫秒 | 0.0x毫秒 | 0.00x毫秒
|
||||
[python](binding/python) | python bindng | 已完成 | 0.x毫秒 | 0.x毫秒 | 0.x毫秒
|
||||
[rust](binding/rust) | rust binding | 已完成 | 0.x毫秒 | 0.x毫秒 | 0.x毫秒
|
||||
|
||||
|
||||
|
||||
|
||||
# ip2region快速测试
|
||||
|
||||
请参考每个binding下的README说明去运行cli测试程序,例如C语言的demo运行如下:
|
||||
```shell
|
||||
cd binding/c/
|
||||
gcc -g -O2 testSearcher.c ip2region.c
|
||||
./a.out ../../data/ip2region.db
|
||||
```
|
||||
|
||||
python:
|
||||
```shell
|
||||
python binding/python/testSearcher.py ./data/ip2region.db
|
||||
```
|
||||
|
||||
lua:
|
||||
```shell
|
||||
cd binding/lua/
|
||||
lua testSearcher.lua ../../data/ip2region.db
|
||||
```
|
||||
|
||||
均会看到如下界面:
|
||||
会看到如下cli界面:
|
||||
```shell
|
||||
initializing B-tree ...
|
||||
+----------------------------------+
|
||||
|
|
@ -96,19 +87,60 @@ p2region>> 101.105.35.57
|
|||
2163|中国|华南|广东省|深圳市|鹏博士 in 0.02295 millseconds
|
||||
```
|
||||
|
||||
输入ip地址开始测试,第一次会稍微有点慢,在运行命令后面接入binary,memory来尝试其他算法,建议使用b-tree算法,速度和并发需求的可以使用memory算法。
|
||||
|
||||
具体集成请参考不同客户端的测试源码。
|
||||
输入IP地址开始测试,第一次会稍微有点慢,在运行命令后面接入binary,memory来尝试其他算法,建议使用b-tree算法,速度和并发需求的可以使用memory算法,具体集成请参考不同binding下的测试源码。
|
||||
|
||||
|
||||
### 6. 如何生成ip2region.db文件
|
||||
|
||||
|
||||
# ip2region安装
|
||||
|
||||
具体请参考每个binding下的README文档和测试demo,以下是一些可用的快捷安装方式:
|
||||
|
||||
### maven仓库地址
|
||||
```xml
|
||||
<dependency>
|
||||
<groupId>org.lionsoul</groupId>
|
||||
<artifactId>ip2region</artifactId>
|
||||
<version>1.7.2</version>
|
||||
</dependency>
|
||||
```
|
||||
|
||||
### nodejs
|
||||
```
|
||||
npm install node-ip2region --save
|
||||
```
|
||||
|
||||
### nuget安装
|
||||
```shell
|
||||
Install-Package IP2Region
|
||||
```
|
||||
|
||||
### php composer
|
||||
```shell
|
||||
# 插件来自:https://github.com/zoujingli/ip2region
|
||||
composer require zoujingli/ip2region
|
||||
```
|
||||
|
||||
|
||||
|
||||
# ip2region 并发使用
|
||||
|
||||
1. 全部binding的各个search接口都<b>不是</b>线程安全的实现,不同线程可以通过创建不同的查询对象来使用,并发量很大的情况下,binary和b-tree算法可能会打开文件数过多的错误,请修改内核的最大允许打开文件数(fs.file-max=一个更高的值),或者使用持久化的memory算法。
|
||||
|
||||
2. memorySearch接口,在发布对象前进行一次预查询(本质上是把ip2region.db文件加载到内存),可以安全用于多线程环境。
|
||||
|
||||
|
||||
|
||||
|
||||
# ip2region.db的生成
|
||||
|
||||
从1.8版本开始,ip2region开源了ip2region.db生成程序的java实现,提供了ant编译支持,编译后会得到以下提到的dbMaker-{version}.jar,对于需要研究生成程序的或者更改自定义生成配置的请参考${ip2region_root}/maker/java内的java源码。
|
||||
|
||||
|
||||
从ip2region 1.2.2版本开始里面提交了一个dbMaker-{version}.jar的可以执行jar文件,用它来完成这个工作:
|
||||
* 1, 确保你安装好了java环境(不玩Java的童鞋就自己谷歌找找拉,临时用一用,几分钟的事情)
|
||||
* 2, cd到${ip2region_root}/maker/java,然后运行如下命令:
|
||||
|
||||
1. 确保你安装好了java环境(不玩Java的童鞋就自己谷歌找找拉,临时用一用,几分钟的事情)
|
||||
2. cd到${ip2region_root}/maker/java,然后运行如下命令:
|
||||
|
||||
```shell
|
||||
java -jar dbMaker-{version}.jar -src 文本数据文件 -region 地域csv文件 [-dst 生成的ip2region.db文件的目录]
|
||||
|
|
@ -118,8 +150,8 @@ java -jar dbMaker-{version}.jar -src 文本数据文件 -region 地域csv文件
|
|||
# ip2region.db文件的目录:是可选参数,没有指定的话会在当前目录生成一份./data/ip2region.db文件
|
||||
```
|
||||
|
||||
* 3, 获取生成的ip2region.db文件覆盖原来的ip2region.db文件即可
|
||||
* 4, 默认的ip2region.db文件生成命令:
|
||||
3. 获取生成的ip2region.db文件覆盖原来的ip2region.db文件即可
|
||||
4. 默认的ip2region.db文件生成命令:
|
||||
|
||||
```shell
|
||||
cd ${ip2region_root}/java/
|
||||
|
|
@ -128,10 +160,14 @@ java -jar dbMaker-1.2.2.jar -src ./data/ip.merge.txt -region ./data/global_regio
|
|||
# 会看到一大片的输出
|
||||
```
|
||||
|
||||
* 5, 数据库文件的结构和原理请阅读 @冬芽 的blog:[“ip2region数据库文件的结构和原理”](http://dongyado.com/tool/2016/08/18/structure-of-ip2region-database-file/)
|
||||
|
||||
|
||||
### 7. 其他备注
|
||||
* 1, 全部binding的各个search接口都<b>不是</b>线程安全的实现,不同线程可以通过创建不同的查询对象来使用。
|
||||
* 2, memorySearch接口,在发布对象前进行一次预查询,可以安全用于多线程环境。
|
||||
* 3, ip2region交流分享,微信:lionsoul2014,QQ:1187582057
|
||||
|
||||
# 相关备注
|
||||
|
||||
### 声明
|
||||
ip2region重点在于<b>研究IP数据的存储设计和各种语言的查询实现</b>,并没有原始IP数据的支撑,数据来源请参考上面的描述,升级数据需要很多IP的支撑并且会对原始平台造成一定量的请求压力,本项目不保证及时的数据更新,没有也不会有商用版本,你可以使用自定义的数据导入ip2region进行自定义查询的实现。
|
||||
|
||||
### 技术交流
|
||||
1. 数据库文件的结构和原理请阅读 @冬芽 的blog:[“ip2region数据库文件的结构和原理”](https://github.com/dongyado/dongyado.github.io/blob/master/_posts/2016-08-18-structure-of-ip2region-database-file.md)
|
||||
2. ip2region交流分享,微信:lionsoul2014(请备注ip2region),QQ:1187582057(很少关注)
|
||||
|
|
|
|||
|
|
@ -7,7 +7,15 @@ namespace IP2Region.Test.xUnit
|
|||
public class SearchTest : IDisposable
|
||||
{
|
||||
private readonly DbSearcher _search;
|
||||
|
||||
|
||||
public String GetRandomIP()
|
||||
{
|
||||
return new Random(Guid.NewGuid().GetHashCode()).Next(0, 255).ToString() + "."
|
||||
+ new Random(Guid.NewGuid().GetHashCode()).Next(0, 255).ToString() + "."
|
||||
+ new Random(Guid.NewGuid().GetHashCode()).Next(0, 255).ToString() + "."
|
||||
+ new Random(Guid.NewGuid().GetHashCode()).Next(0, 255).ToString();
|
||||
}
|
||||
|
||||
public SearchTest()
|
||||
{
|
||||
_search = new DbSearcher(Environment.CurrentDirectory + @"\DB\ip2region.db");
|
||||
|
|
@ -15,9 +23,9 @@ namespace IP2Region.Test.xUnit
|
|||
[Fact]
|
||||
public void Search_Test()
|
||||
{
|
||||
string memResult = _search.MemorySearch("183.192.62.65").Region;
|
||||
string binarySearchResult = _search.BinarySearch("183.192.62.65").Region;
|
||||
string binaryTreeSearchResult = _search.BtreeSearch("183.192.62.65").Region;
|
||||
string memResult = _search.MemorySearch("223.104.246.20").Region;
|
||||
string binarySearchResult = _search.BinarySearch("223.104.246.20").Region;
|
||||
string binaryTreeSearchResult = _search.BtreeSearch("223.104.246.20").Region;
|
||||
|
||||
Assert.NotNull(memResult);
|
||||
Assert.NotNull(binarySearchResult);
|
||||
|
|
@ -27,6 +35,21 @@ namespace IP2Region.Test.xUnit
|
|||
Assert.Equal(binaryTreeSearchResult, memResult);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Search_Correct_Test()
|
||||
{
|
||||
for (int i = 0; i < 1000000; i++)
|
||||
{
|
||||
var newIp=GetRandomIP();
|
||||
string memResult = _search.MemorySearch(newIp).Region;
|
||||
string binarySearchResult = _search.BinarySearch(newIp).Region;
|
||||
string binaryTreeSearchResult = _search.BtreeSearch(newIp).Region;
|
||||
|
||||
Assert.True(memResult == binarySearchResult && memResult == binaryTreeSearchResult);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task SearchAsync_Test()
|
||||
{
|
||||
|
|
|
|||
|
|
@ -0,0 +1,3 @@
|
|||
# 说明
|
||||
|
||||
- 编译本模块时,请手动链接对../c/ip2region.c文件的依赖。
|
||||
|
|
@ -0,0 +1,44 @@
|
|||
ngx_addon_name="ngx_ip2region_module"
|
||||
|
||||
IP2REGION_CORE_MODULES=" \
|
||||
ngx_ip2region_module \
|
||||
"
|
||||
|
||||
IP2REGION_DEPS=" \
|
||||
$ngx_addon_dir/ip2region.h \
|
||||
$ngx_addon_dir/ngx_ip2region.h \
|
||||
"
|
||||
|
||||
IP2REGION_CORE_SRCS=" \
|
||||
$ngx_addon_dir/ip2region.c \
|
||||
$ngx_addon_dir/ngx_ip2region_module.c \
|
||||
"
|
||||
|
||||
|
||||
|
||||
if [ -f auto/module ] ; then
|
||||
ngx_module_incs=$ngx_addon_dir
|
||||
ngx_module_deps=$IP2REGION_DEPS
|
||||
|
||||
if [ $ngx_module_link = DYNAMIC ] ; then
|
||||
ngx_module_name="$IP2REGION_CORE_MODULES"
|
||||
ngx_module_srcs="$IP2REGION_CORE_SRCS"
|
||||
|
||||
. auto/module
|
||||
|
||||
else
|
||||
ngx_module_type=CORE
|
||||
ngx_module_name=$IP2REGION_CORE_MODULES
|
||||
ngx_module_srcs=$IP2REGION_CORE_SRCS
|
||||
|
||||
. auto/module
|
||||
fi
|
||||
|
||||
else
|
||||
CORE_MODULES="$CORE_MODULES $IP2REGION_CORE_MODULES"
|
||||
|
||||
NGX_ADDON_DEPS="$NGX_ADDON_DEPS $IP2REGION_DEPS"
|
||||
NGX_ADDON_SRCS="$NGX_ADDON_SRCS $IP2REGION_CORE_SRCS"
|
||||
|
||||
CFLAGS="$CFLAGS -I$ngx_addon_dir "
|
||||
fi
|
||||
|
|
@ -0,0 +1,23 @@
|
|||
#ifndef __NGX_IP2REGION_H__
|
||||
#define __NGX_IP2REGION_H__
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "../c/ip2region.h"
|
||||
|
||||
typedef struct ngx_ip2region_conf_s {
|
||||
ngx_str_t db_file;
|
||||
ngx_uint_t algo;
|
||||
} ngx_ip2region_conf_t;
|
||||
|
||||
typedef uint_t (*search_func_ptr)(ip2region_t, uint_t, datablock_t);
|
||||
|
||||
extern ngx_int_t ngx_ip2region_search(ngx_str_t *addr_text, ngx_str_t *isp, ngx_str_t *city);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
|
@ -0,0 +1,260 @@
|
|||
#include <ngx_config.h>
|
||||
#include <ngx_core.h>
|
||||
|
||||
#include "ngx_ip2region.h"
|
||||
|
||||
|
||||
static void *ngx_ip2region_create_conf(ngx_cycle_t *cycle);
|
||||
static char *ngx_ip2region_init_conf(ngx_cycle_t *cycle, void *conf);
|
||||
|
||||
static ngx_int_t ngx_ip2region_init_process(ngx_cycle_t *cycle);
|
||||
static void ngx_ip2region_exit_process(ngx_cycle_t *cycle);
|
||||
|
||||
static ip2region_entry g_ip2region_entry;
|
||||
|
||||
|
||||
search_func_ptr ip2region_search_func;
|
||||
|
||||
|
||||
#define NGX_IP2REGION_MEMORY 0
|
||||
#define NGX_IP2REGION_BINARY 1
|
||||
#define NGX_IP2REGION_BTREE 2
|
||||
|
||||
static ngx_conf_enum_t ngx_ip2region_search_algo[] = {
|
||||
{ ngx_string("memory"), NGX_IP2REGION_MEMORY },
|
||||
{ ngx_string("binary"), NGX_IP2REGION_BINARY },
|
||||
{ ngx_string("btree"), NGX_IP2REGION_BTREE},
|
||||
{ ngx_null_string, 0 }
|
||||
};
|
||||
|
||||
|
||||
static ngx_command_t ngx_ip2region_commands[] = {
|
||||
|
||||
{
|
||||
ngx_string("ip2region_db_file"),
|
||||
NGX_MAIN_CONF | NGX_DIRECT_CONF | NGX_CONF_TAKE1,
|
||||
ngx_conf_set_str_slot,
|
||||
0,
|
||||
offsetof(ngx_ip2region_conf_t, db_file),
|
||||
NULL
|
||||
},
|
||||
|
||||
{
|
||||
ngx_string("ip2region_algo"),
|
||||
NGX_MAIN_CONF | NGX_DIRECT_CONF | NGX_CONF_TAKE1,
|
||||
ngx_conf_set_enum_slot,
|
||||
0,
|
||||
offsetof(ngx_ip2region_conf_t, algo),
|
||||
&ngx_ip2region_search_algo
|
||||
},
|
||||
|
||||
ngx_null_command
|
||||
};
|
||||
|
||||
|
||||
static ngx_core_module_t ngx_ip2region_module_ctx = {
|
||||
ngx_string("ip2region"),
|
||||
ngx_ip2region_create_conf,
|
||||
ngx_ip2region_init_conf,
|
||||
};
|
||||
|
||||
|
||||
ngx_module_t ngx_ip2region_module = {
|
||||
NGX_MODULE_V1,
|
||||
&ngx_ip2region_module_ctx, /* module context */
|
||||
ngx_ip2region_commands, /* module directives */
|
||||
NGX_CORE_MODULE, /* module type */
|
||||
NULL, /* init master */
|
||||
NULL, /* init module */
|
||||
ngx_ip2region_init_process, /* init process */
|
||||
NULL, /* init thread */
|
||||
NULL, /* exit thread */
|
||||
ngx_ip2region_exit_process, /* exit process */
|
||||
NULL, /* exit master */
|
||||
NGX_MODULE_V1_PADDING
|
||||
};
|
||||
|
||||
static void *
|
||||
ngx_ip2region_create_conf(ngx_cycle_t *cycle)
|
||||
{
|
||||
ngx_ip2region_conf_t *ip2region_conf;
|
||||
ip2region_conf = ngx_pcalloc(cycle->pool, sizeof(ngx_ip2region_conf_t));
|
||||
|
||||
if(ip2region_conf == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ip2region_conf->algo = NGX_CONF_UNSET_UINT;
|
||||
return ip2region_conf;
|
||||
}
|
||||
|
||||
static char *
|
||||
ngx_ip2region_init_conf(ngx_cycle_t *cycle, void *conf)
|
||||
{
|
||||
ngx_ip2region_conf_t *ip2region_conf = (ngx_ip2region_conf_t *)conf;
|
||||
|
||||
if(ip2region_conf->db_file.len == 0) {
|
||||
//ngx_str_set(&ip2region_conf->db_file, "conf/ip2region.db");
|
||||
return NGX_CONF_OK;
|
||||
}
|
||||
|
||||
if(ngx_conf_full_name(cycle, &ip2region_conf->db_file, 0) != NGX_OK) {
|
||||
return NGX_CONF_ERROR;
|
||||
}
|
||||
|
||||
ngx_log_debug1(NGX_LOG_INFO, ngx_cycle->log, 0, "%V", &ip2region_conf->db_file);
|
||||
|
||||
if(ip2region_conf->algo == NGX_CONF_UNSET_UINT) {
|
||||
ip2region_conf->algo = NGX_IP2REGION_MEMORY;
|
||||
}
|
||||
|
||||
return NGX_CONF_OK;
|
||||
}
|
||||
|
||||
static ngx_int_t
|
||||
ngx_ip2region_init_process(ngx_cycle_t *cycle)
|
||||
{
|
||||
ngx_ip2region_conf_t *conf = (ngx_ip2region_conf_t *)ngx_get_conf(ngx_cycle->conf_ctx, ngx_ip2region_module);
|
||||
|
||||
if(conf->db_file.len == 0) {
|
||||
ngx_log_debug0(NGX_LOG_INFO, ngx_cycle->log, 0, "ip2region not init");
|
||||
return NGX_OK;
|
||||
}
|
||||
|
||||
if(!ip2region_create(&g_ip2region_entry, (char *)conf->db_file.data)) {
|
||||
ngx_log_error(NGX_LOG_ERR, ngx_cycle->log, 0, "ip2region create failed: %V", &conf->db_file);
|
||||
return NGX_ERROR;
|
||||
}
|
||||
|
||||
switch(conf->algo) {
|
||||
default:
|
||||
case NGX_IP2REGION_MEMORY:
|
||||
ip2region_search_func = ip2region_memory_search;
|
||||
break;
|
||||
|
||||
case NGX_IP2REGION_BINARY:
|
||||
ip2region_search_func = ip2region_binary_search;
|
||||
break;
|
||||
|
||||
case NGX_IP2REGION_BTREE:
|
||||
ip2region_search_func = ip2region_btree_search;
|
||||
break;
|
||||
}
|
||||
|
||||
ngx_log_error(NGX_LOG_INFO, ngx_cycle->log, 0, "ip2region create succcess: algo=%ui", conf->algo);
|
||||
return NGX_OK;
|
||||
}
|
||||
|
||||
static void
|
||||
ngx_ip2region_exit_process(ngx_cycle_t *cycle)
|
||||
{
|
||||
ip2region_destroy(&g_ip2region_entry);
|
||||
ngx_log_debug0(NGX_LOG_INFO, ngx_cycle->log, 0, "ip2region destroy");
|
||||
}
|
||||
|
||||
static ngx_inline u_char *
|
||||
ngx_strrchr(u_char *first, u_char *p, u_char c)
|
||||
{
|
||||
while(p >= first) {
|
||||
if(*p == c) {
|
||||
return p;
|
||||
}
|
||||
|
||||
p--;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static ngx_inline uint32_t
|
||||
ngx_inet_aton(u_char *data, ngx_uint_t len)
|
||||
{
|
||||
long long result = 0;
|
||||
long long temp = 0;
|
||||
u_char *last = data + len;
|
||||
int point = 0;
|
||||
|
||||
while(data <= last) {
|
||||
if(*data == '.' || data == last) {
|
||||
if(temp > 255) {
|
||||
return NGX_ERROR;
|
||||
}
|
||||
|
||||
result = (result << 8) + temp;
|
||||
temp = 0;
|
||||
++point;
|
||||
|
||||
if(point == 4) {
|
||||
break;
|
||||
}
|
||||
|
||||
} else if(*data <= '9' && *data >= '0') {
|
||||
temp = temp * 10 + (*data - '0');
|
||||
|
||||
} else {
|
||||
return NGX_ERROR;
|
||||
}
|
||||
|
||||
++data;
|
||||
}
|
||||
|
||||
if(point != 4) {
|
||||
return NGX_ERROR;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
ngx_int_t
|
||||
ngx_ip2region_search(ngx_str_t *addr_text, ngx_str_t *isp, ngx_str_t *city)
|
||||
{
|
||||
if(g_ip2region_entry.dbHandler == NULL) {
|
||||
ngx_log_error(NGX_LOG_ERR, ngx_cycle->log, 0, "search error ip %V, ip2region doesn't create", addr_text);
|
||||
return NGX_ERROR;
|
||||
}
|
||||
|
||||
uint32_t addr_binary = ngx_inet_aton(addr_text->data, addr_text->len);
|
||||
|
||||
if(addr_binary == (uint32_t)NGX_ERROR) {
|
||||
ngx_log_error(NGX_LOG_ERR, ngx_cycle->log, 0, "search error ip %V: bad ip address", addr_text);
|
||||
return NGX_ERROR;
|
||||
}
|
||||
|
||||
datablock_entry datablock;
|
||||
ngx_memzero(&datablock, sizeof(datablock));
|
||||
uint_t rc = ip2region_search_func(&g_ip2region_entry, (uint_t)addr_binary, &datablock);
|
||||
|
||||
if(!rc) {
|
||||
ngx_log_error(NGX_LOG_ERR, ngx_cycle->log, 0, "%V search failed", addr_text);
|
||||
return NGX_ERROR;
|
||||
}
|
||||
|
||||
ngx_log_debug2(NGX_LOG_INFO, ngx_cycle->log, 0, "%V: %s", addr_text, datablock.region);
|
||||
//城市Id 国家|区域|省份|城市|ISP
|
||||
u_char *end = (u_char *)(datablock.region + ngx_strlen(datablock.region));
|
||||
u_char *pos = ngx_strrchr((u_char *)datablock.region, end, '|');
|
||||
|
||||
if(!pos) {
|
||||
ngx_log_error(NGX_LOG_ERR, ngx_cycle->log, 0, "search isp failed");
|
||||
return NGX_ERROR;
|
||||
}
|
||||
|
||||
u_char isp_buffer[64] = {0};
|
||||
ngx_snprintf(isp_buffer, sizeof(isp_buffer), "%*s%Z", end - pos, pos + 1);
|
||||
ngx_log_debug3(NGX_LOG_INFO, ngx_cycle->log, 0, "%V: %s [%s]", addr_text, datablock.region, (char *)isp_buffer);
|
||||
|
||||
if(city) {
|
||||
end = pos - 1;
|
||||
u_char *pos_city = ngx_strrchr((u_char *)datablock.region, end, '|');
|
||||
|
||||
if(!pos_city) {
|
||||
ngx_log_debug0(NGX_LOG_ERR, ngx_cycle->log, 0, "search city failed");
|
||||
return NGX_ERROR;
|
||||
}
|
||||
|
||||
u_char city_buffer[64] = {0};
|
||||
ngx_snprintf(city_buffer, sizeof(city_buffer), "%*s%Z", end - pos_city, pos_city + 1);
|
||||
}
|
||||
|
||||
return NGX_OK;
|
||||
}
|
||||
|
|
@ -1,14 +1,31 @@
|
|||
# nodejs 客户端
|
||||
|
||||
官方维护的 ip2region, 每次数据更新后会更新到 npm
|
||||
|
||||
|
||||
## Install
|
||||
|
||||
**node 版本 : >= 6.0.0**
|
||||
|
||||
```
|
||||
npm install lionsoul-ip2region --save
|
||||
npm install node-ip2region --save
|
||||
```
|
||||
|
||||
## 已测试通过的 node 版本列表
|
||||
|
||||
```
|
||||
6.0.0
|
||||
6.11.2
|
||||
8.0.0
|
||||
10.0.0
|
||||
12.0.0
|
||||
```
|
||||
|
||||
|
||||
## Example
|
||||
|
||||
```
|
||||
const searcher = require('lionsoul-ip2region').create();
|
||||
const searcher = require('node-ip2region').create();
|
||||
searcher.btreeSearchSync('xxx.xxx.xxx.xxx')
|
||||
// => { city: 2163, region: '中国|0|广东省|深圳市|联通' }
|
||||
```
|
||||
|
|
@ -83,4 +100,4 @@ Rand Name Time (in milliseconds)
|
|||
4 BinarySearchSync 1.639
|
||||
5 BtreeSearch 3.407
|
||||
6 BinarySearch 6.497
|
||||
```
|
||||
```
|
||||
|
|
|
|||
|
|
@ -37,23 +37,6 @@
|
|||
"json-schema-traverse": "^0.3.0"
|
||||
}
|
||||
},
|
||||
"align-text": {
|
||||
"version": "0.1.4",
|
||||
"resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz",
|
||||
"integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"kind-of": "^3.0.2",
|
||||
"longest": "^1.0.1",
|
||||
"repeat-string": "^1.5.2"
|
||||
}
|
||||
},
|
||||
"amdefine": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
|
||||
"integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=",
|
||||
"dev": true
|
||||
},
|
||||
"ansi-escapes": {
|
||||
"version": "1.4.0",
|
||||
"resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz",
|
||||
|
|
@ -397,7 +380,7 @@
|
|||
"component-emitter": "^1.2.1",
|
||||
"define-property": "^1.0.0",
|
||||
"isobject": "^3.0.1",
|
||||
"mixin-deep": "^1.2.0",
|
||||
"mixin-deep": "^1.3.2",
|
||||
"pascalcase": "^0.1.1"
|
||||
},
|
||||
"dependencies": {
|
||||
|
|
@ -416,7 +399,7 @@
|
|||
"integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"kind-of": "^6.0.0"
|
||||
"kind-of": "^6.0.3"
|
||||
}
|
||||
},
|
||||
"is-data-descriptor": {
|
||||
|
|
@ -425,7 +408,7 @@
|
|||
"integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"kind-of": "^6.0.0"
|
||||
"kind-of": "^6.0.3"
|
||||
}
|
||||
},
|
||||
"is-descriptor": {
|
||||
|
|
@ -436,7 +419,7 @@
|
|||
"requires": {
|
||||
"is-accessor-descriptor": "^1.0.0",
|
||||
"is-data-descriptor": "^1.0.0",
|
||||
"kind-of": "^6.0.2"
|
||||
"kind-of": "^6.0.3"
|
||||
}
|
||||
},
|
||||
"isobject": {
|
||||
|
|
@ -446,8 +429,8 @@
|
|||
"dev": true
|
||||
},
|
||||
"kind-of": {
|
||||
"version": "6.0.2",
|
||||
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
|
||||
"version": "6.0.3",
|
||||
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
|
||||
"integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
|
||||
"dev": true
|
||||
}
|
||||
|
|
@ -537,7 +520,7 @@
|
|||
"get-value": "^2.0.6",
|
||||
"has-value": "^1.0.0",
|
||||
"isobject": "^3.0.1",
|
||||
"set-value": "^2.0.0",
|
||||
"set-value": "^2.0.1",
|
||||
"to-object-path": "^0.3.0",
|
||||
"union-value": "^1.0.0",
|
||||
"unset-value": "^1.0.0"
|
||||
|
|
@ -557,30 +540,12 @@
|
|||
"integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=",
|
||||
"dev": true
|
||||
},
|
||||
"camelcase": {
|
||||
"version": "1.2.1",
|
||||
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz",
|
||||
"integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=",
|
||||
"dev": true,
|
||||
"optional": true
|
||||
},
|
||||
"caseless": {
|
||||
"version": "0.12.0",
|
||||
"resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
|
||||
"integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
|
||||
"dev": true
|
||||
},
|
||||
"center-align": {
|
||||
"version": "0.1.3",
|
||||
"resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz",
|
||||
"integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=",
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"align-text": "^0.1.3",
|
||||
"lazy-cache": "^1.0.3"
|
||||
}
|
||||
},
|
||||
"chalk": {
|
||||
"version": "1.1.3",
|
||||
"resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
|
||||
|
|
@ -629,27 +594,6 @@
|
|||
}
|
||||
}
|
||||
},
|
||||
"cliui": {
|
||||
"version": "2.1.0",
|
||||
"resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz",
|
||||
"integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=",
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"center-align": "^0.1.1",
|
||||
"right-align": "^0.1.1",
|
||||
"wordwrap": "0.0.2"
|
||||
},
|
||||
"dependencies": {
|
||||
"wordwrap": {
|
||||
"version": "0.0.2",
|
||||
"resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz",
|
||||
"integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=",
|
||||
"dev": true,
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"co": {
|
||||
"version": "4.6.0",
|
||||
"resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
|
||||
|
|
@ -696,6 +640,13 @@
|
|||
"delayed-stream": "~1.0.0"
|
||||
}
|
||||
},
|
||||
"commander": {
|
||||
"version": "2.20.3",
|
||||
"resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
|
||||
"integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
|
||||
"dev": true,
|
||||
"optional": true
|
||||
},
|
||||
"compare-versions": {
|
||||
"version": "3.3.0",
|
||||
"resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.3.0.tgz",
|
||||
|
|
@ -820,7 +771,7 @@
|
|||
"integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"kind-of": "^6.0.0"
|
||||
"kind-of": "^6.0.3"
|
||||
}
|
||||
},
|
||||
"is-data-descriptor": {
|
||||
|
|
@ -829,7 +780,7 @@
|
|||
"integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"kind-of": "^6.0.0"
|
||||
"kind-of": "^6.0.3"
|
||||
}
|
||||
},
|
||||
"is-descriptor": {
|
||||
|
|
@ -840,7 +791,7 @@
|
|||
"requires": {
|
||||
"is-accessor-descriptor": "^1.0.0",
|
||||
"is-data-descriptor": "^1.0.0",
|
||||
"kind-of": "^6.0.2"
|
||||
"kind-of": "^6.0.3"
|
||||
}
|
||||
},
|
||||
"isobject": {
|
||||
|
|
@ -850,8 +801,8 @@
|
|||
"dev": true
|
||||
},
|
||||
"kind-of": {
|
||||
"version": "6.0.2",
|
||||
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
|
||||
"version": "6.0.3",
|
||||
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
|
||||
"integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
|
||||
"dev": true
|
||||
}
|
||||
|
|
@ -1212,30 +1163,32 @@
|
|||
"dev": true
|
||||
},
|
||||
"handlebars": {
|
||||
"version": "4.1.2",
|
||||
"resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.2.tgz",
|
||||
"integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=",
|
||||
"version": "4.5.3",
|
||||
"resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.5.3.tgz",
|
||||
"integrity": "sha512-3yPecJoJHK/4c6aZhSvxOyG4vJKDshV36VHp0iVCDVh7o9w2vwi3NSnL2MMPj3YdduqaBcu7cGbggJQM0br9xA==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"async": "^1.4.0",
|
||||
"neo-async": "^2.6.0",
|
||||
"optimist": "^0.6.1",
|
||||
"source-map": "^0.4.4",
|
||||
"uglify-js": "^2.6"
|
||||
"source-map": "^0.6.1",
|
||||
"uglify-js": "^3.1.4"
|
||||
},
|
||||
"dependencies": {
|
||||
"async": {
|
||||
"version": "1.5.2",
|
||||
"resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
|
||||
"integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
|
||||
"source-map": {
|
||||
"version": "0.6.1",
|
||||
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
|
||||
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
|
||||
"dev": true
|
||||
},
|
||||
"source-map": {
|
||||
"version": "0.4.4",
|
||||
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz",
|
||||
"integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=",
|
||||
"uglify-js": {
|
||||
"version": "3.7.3",
|
||||
"resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.7.3.tgz",
|
||||
"integrity": "sha512-7tINm46/3puUA4hCkKYo4Xdts+JDaVC9ZPRcG8Xw9R4nhO/gZgUM3TENq8IF4Vatk8qCig4MzP/c8G4u2BkVQg==",
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"amdefine": ">=0.0.4"
|
||||
"commander": "~2.20.3",
|
||||
"source-map": "~0.6.1"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1297,7 +1250,7 @@
|
|||
"dev": true,
|
||||
"requires": {
|
||||
"is-number": "^3.0.0",
|
||||
"kind-of": "^4.0.0"
|
||||
"kind-of": "^6.0.3"
|
||||
},
|
||||
"dependencies": {
|
||||
"is-number": {
|
||||
|
|
@ -1306,12 +1259,12 @@
|
|||
"integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"kind-of": "^3.0.2"
|
||||
"kind-of": "^6.0.3"
|
||||
},
|
||||
"dependencies": {
|
||||
"kind-of": {
|
||||
"version": "3.2.2",
|
||||
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
|
||||
"version": "6.0.3",
|
||||
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
|
||||
"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
|
|
@ -1321,8 +1274,8 @@
|
|||
}
|
||||
},
|
||||
"kind-of": {
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
|
||||
"version": "6.0.3",
|
||||
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
|
||||
"integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
|
|
@ -1410,7 +1363,7 @@
|
|||
"integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"kind-of": "^3.0.2"
|
||||
"kind-of": "^6.0.3"
|
||||
}
|
||||
},
|
||||
"is-arrayish": {
|
||||
|
|
@ -1449,7 +1402,7 @@
|
|||
"integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"kind-of": "^3.0.2"
|
||||
"kind-of": "^6.0.3"
|
||||
}
|
||||
},
|
||||
"is-descriptor": {
|
||||
|
|
@ -1460,12 +1413,12 @@
|
|||
"requires": {
|
||||
"is-accessor-descriptor": "^0.1.6",
|
||||
"is-data-descriptor": "^0.1.4",
|
||||
"kind-of": "^5.0.0"
|
||||
"kind-of": "^6.0.3"
|
||||
},
|
||||
"dependencies": {
|
||||
"kind-of": {
|
||||
"version": "5.1.0",
|
||||
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
|
||||
"version": "6.0.3",
|
||||
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
|
||||
"integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
|
||||
"dev": true
|
||||
}
|
||||
|
|
@ -1531,7 +1484,7 @@
|
|||
"integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"kind-of": "^3.0.2"
|
||||
"kind-of": "^6.0.3"
|
||||
}
|
||||
},
|
||||
"is-plain-object": {
|
||||
|
|
@ -2085,21 +2038,14 @@
|
|||
}
|
||||
},
|
||||
"kind-of": {
|
||||
"version": "3.2.2",
|
||||
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
|
||||
"version": "6.0.3",
|
||||
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
|
||||
"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"is-buffer": "^1.1.5"
|
||||
}
|
||||
},
|
||||
"lazy-cache": {
|
||||
"version": "1.0.4",
|
||||
"resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz",
|
||||
"integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=",
|
||||
"dev": true,
|
||||
"optional": true
|
||||
},
|
||||
"lcid": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz",
|
||||
|
|
@ -2165,12 +2111,6 @@
|
|||
"integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==",
|
||||
"dev": true
|
||||
},
|
||||
"longest": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz",
|
||||
"integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=",
|
||||
"dev": true
|
||||
},
|
||||
"loose-envify": {
|
||||
"version": "1.4.0",
|
||||
"resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
|
||||
|
|
@ -2230,7 +2170,7 @@
|
|||
"filename-regex": "^2.0.0",
|
||||
"is-extglob": "^1.0.0",
|
||||
"is-glob": "^2.0.1",
|
||||
"kind-of": "^3.0.2",
|
||||
"kind-of": "^6.0.3",
|
||||
"normalize-path": "^2.0.1",
|
||||
"object.omit": "^2.0.0",
|
||||
"parse-glob": "^3.0.4",
|
||||
|
|
@ -2262,14 +2202,14 @@
|
|||
}
|
||||
},
|
||||
"minimist": {
|
||||
"version": "0.0.8",
|
||||
"resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
|
||||
"version": "0.2.1",
|
||||
"resolved": "https://registry.npmjs.org/minimist/-/minimist-0.2.1.tgz",
|
||||
"integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
|
||||
"dev": true
|
||||
},
|
||||
"mixin-deep": {
|
||||
"version": "1.3.1",
|
||||
"resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz",
|
||||
"version": "1.3.2",
|
||||
"resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz",
|
||||
"integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
|
|
@ -2294,7 +2234,7 @@
|
|||
"integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"minimist": "0.0.8"
|
||||
"minimist": "0.2.1"
|
||||
}
|
||||
},
|
||||
"ms": {
|
||||
|
|
@ -2315,7 +2255,7 @@
|
|||
"extend-shallow": "^3.0.2",
|
||||
"fragment-cache": "^0.2.1",
|
||||
"is-windows": "^1.0.2",
|
||||
"kind-of": "^6.0.2",
|
||||
"kind-of": "^6.0.3",
|
||||
"object.pick": "^1.3.0",
|
||||
"regex-not": "^1.0.0",
|
||||
"snapdragon": "^0.8.1",
|
||||
|
|
@ -2335,8 +2275,8 @@
|
|||
"dev": true
|
||||
},
|
||||
"kind-of": {
|
||||
"version": "6.0.2",
|
||||
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
|
||||
"version": "6.0.3",
|
||||
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
|
||||
"integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
|
||||
"dev": true
|
||||
}
|
||||
|
|
@ -2348,6 +2288,12 @@
|
|||
"integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
|
||||
"dev": true
|
||||
},
|
||||
"neo-async": {
|
||||
"version": "2.6.1",
|
||||
"resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz",
|
||||
"integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==",
|
||||
"dev": true
|
||||
},
|
||||
"node-int64": {
|
||||
"version": "0.4.0",
|
||||
"resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz",
|
||||
|
|
@ -2419,7 +2365,7 @@
|
|||
"requires": {
|
||||
"copy-descriptor": "^0.1.0",
|
||||
"define-property": "^0.2.5",
|
||||
"kind-of": "^3.0.3"
|
||||
"kind-of": "^6.0.3"
|
||||
},
|
||||
"dependencies": {
|
||||
"define-property": {
|
||||
|
|
@ -2492,7 +2438,7 @@
|
|||
"integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"minimist": "~0.0.1",
|
||||
"minimist": "~0.2.1",
|
||||
"wordwrap": "~0.0.2"
|
||||
}
|
||||
},
|
||||
|
|
@ -2733,7 +2679,7 @@
|
|||
"dev": true,
|
||||
"requires": {
|
||||
"is-number": "^4.0.0",
|
||||
"kind-of": "^6.0.0",
|
||||
"kind-of": "^6.0.3",
|
||||
"math-random": "^1.0.1"
|
||||
},
|
||||
"dependencies": {
|
||||
|
|
@ -2744,8 +2690,8 @@
|
|||
"dev": true
|
||||
},
|
||||
"kind-of": {
|
||||
"version": "6.0.2",
|
||||
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
|
||||
"version": "6.0.3",
|
||||
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
|
||||
"integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
|
||||
"dev": true
|
||||
}
|
||||
|
|
@ -2917,16 +2863,6 @@
|
|||
"integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
|
||||
"dev": true
|
||||
},
|
||||
"right-align": {
|
||||
"version": "0.1.3",
|
||||
"resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz",
|
||||
"integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=",
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"align-text": "^0.1.1"
|
||||
}
|
||||
},
|
||||
"rimraf": {
|
||||
"version": "2.6.2",
|
||||
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz",
|
||||
|
|
@ -2991,8 +2927,8 @@
|
|||
}
|
||||
},
|
||||
"minimist": {
|
||||
"version": "1.2.0",
|
||||
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
|
||||
"version": "0.2.1",
|
||||
"resolved": "https://registry.npmjs.org/minimist/-/minimist-0.2.1.tgz",
|
||||
"integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
|
||||
"dev": true
|
||||
}
|
||||
|
|
@ -3017,8 +2953,8 @@
|
|||
"dev": true
|
||||
},
|
||||
"set-value": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz",
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz",
|
||||
"integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
|
|
@ -3113,7 +3049,7 @@
|
|||
"integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"kind-of": "^6.0.0"
|
||||
"kind-of": "^6.0.3"
|
||||
}
|
||||
},
|
||||
"is-data-descriptor": {
|
||||
|
|
@ -3122,7 +3058,7 @@
|
|||
"integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"kind-of": "^6.0.0"
|
||||
"kind-of": "^6.0.3"
|
||||
}
|
||||
},
|
||||
"is-descriptor": {
|
||||
|
|
@ -3133,7 +3069,7 @@
|
|||
"requires": {
|
||||
"is-accessor-descriptor": "^1.0.0",
|
||||
"is-data-descriptor": "^1.0.0",
|
||||
"kind-of": "^6.0.2"
|
||||
"kind-of": "^6.0.3"
|
||||
}
|
||||
},
|
||||
"isobject": {
|
||||
|
|
@ -3143,8 +3079,8 @@
|
|||
"dev": true
|
||||
},
|
||||
"kind-of": {
|
||||
"version": "6.0.2",
|
||||
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
|
||||
"version": "6.0.3",
|
||||
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
|
||||
"integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
|
||||
"dev": true
|
||||
}
|
||||
|
|
@ -3156,7 +3092,7 @@
|
|||
"integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"kind-of": "^3.2.0"
|
||||
"kind-of": "^6.0.3"
|
||||
}
|
||||
},
|
||||
"source-map": {
|
||||
|
|
@ -3418,12 +3354,12 @@
|
|||
"integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"kind-of": "^3.0.2"
|
||||
"kind-of": "^6.0.3"
|
||||
},
|
||||
"dependencies": {
|
||||
"kind-of": {
|
||||
"version": "3.2.2",
|
||||
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
|
||||
"version": "6.0.3",
|
||||
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
|
||||
"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
|
|
@ -3438,12 +3374,12 @@
|
|||
"integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"kind-of": "^3.0.2"
|
||||
"kind-of": "^6.0.3"
|
||||
},
|
||||
"dependencies": {
|
||||
"kind-of": {
|
||||
"version": "3.2.2",
|
||||
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
|
||||
"version": "6.0.3",
|
||||
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
|
||||
"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
|
|
@ -3460,12 +3396,12 @@
|
|||
"requires": {
|
||||
"is-accessor-descriptor": "^0.1.6",
|
||||
"is-data-descriptor": "^0.1.4",
|
||||
"kind-of": "^5.0.0"
|
||||
"kind-of": "^6.0.3"
|
||||
}
|
||||
},
|
||||
"kind-of": {
|
||||
"version": "5.1.0",
|
||||
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
|
||||
"version": "6.0.3",
|
||||
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
|
||||
"integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
|
||||
"dev": true
|
||||
}
|
||||
|
|
@ -3536,7 +3472,7 @@
|
|||
"integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"kind-of": "^6.0.0"
|
||||
"kind-of": "^6.0.3"
|
||||
}
|
||||
},
|
||||
"is-data-descriptor": {
|
||||
|
|
@ -3545,7 +3481,7 @@
|
|||
"integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"kind-of": "^6.0.0"
|
||||
"kind-of": "^6.0.3"
|
||||
}
|
||||
},
|
||||
"is-descriptor": {
|
||||
|
|
@ -3556,7 +3492,7 @@
|
|||
"requires": {
|
||||
"is-accessor-descriptor": "^1.0.0",
|
||||
"is-data-descriptor": "^1.0.0",
|
||||
"kind-of": "^6.0.2"
|
||||
"kind-of": "^6.0.3"
|
||||
}
|
||||
},
|
||||
"is-number": {
|
||||
|
|
@ -3565,12 +3501,12 @@
|
|||
"integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"kind-of": "^3.0.2"
|
||||
"kind-of": "^6.0.3"
|
||||
},
|
||||
"dependencies": {
|
||||
"kind-of": {
|
||||
"version": "3.2.2",
|
||||
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
|
||||
"version": "6.0.3",
|
||||
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
|
||||
"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
|
|
@ -3586,8 +3522,8 @@
|
|||
"dev": true
|
||||
},
|
||||
"kind-of": {
|
||||
"version": "6.0.2",
|
||||
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
|
||||
"version": "6.0.3",
|
||||
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
|
||||
"integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
|
||||
"dev": true
|
||||
},
|
||||
|
|
@ -3604,7 +3540,7 @@
|
|||
"extend-shallow": "^3.0.2",
|
||||
"extglob": "^2.0.4",
|
||||
"fragment-cache": "^0.2.1",
|
||||
"kind-of": "^6.0.2",
|
||||
"kind-of": "^6.0.3",
|
||||
"nanomatch": "^1.2.9",
|
||||
"object.pick": "^1.3.0",
|
||||
"regex-not": "^1.0.0",
|
||||
|
|
@ -3638,7 +3574,7 @@
|
|||
"integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"kind-of": "^3.0.2"
|
||||
"kind-of": "^6.0.3"
|
||||
}
|
||||
},
|
||||
"to-regex": {
|
||||
|
|
@ -3669,7 +3605,7 @@
|
|||
"integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"kind-of": "^3.0.2"
|
||||
"kind-of": "^6.0.3"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -3721,40 +3657,6 @@
|
|||
"prelude-ls": "~1.1.2"
|
||||
}
|
||||
},
|
||||
"uglify-js": {
|
||||
"version": "2.8.29",
|
||||
"resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz",
|
||||
"integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=",
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"source-map": "~0.5.1",
|
||||
"uglify-to-browserify": "~1.0.0",
|
||||
"yargs": "~3.10.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"yargs": {
|
||||
"version": "3.10.0",
|
||||
"resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz",
|
||||
"integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=",
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"camelcase": "^1.0.2",
|
||||
"cliui": "^2.1.0",
|
||||
"decamelize": "^1.0.0",
|
||||
"window-size": "0.1.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"uglify-to-browserify": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz",
|
||||
"integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=",
|
||||
"dev": true,
|
||||
"optional": true
|
||||
},
|
||||
"union-value": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz",
|
||||
|
|
@ -3764,7 +3666,7 @@
|
|||
"arr-union": "^3.1.0",
|
||||
"get-value": "^2.0.6",
|
||||
"is-extendable": "^0.1.1",
|
||||
"set-value": "^0.4.3"
|
||||
"set-value": "^2.0.1"
|
||||
},
|
||||
"dependencies": {
|
||||
"extend-shallow": {
|
||||
|
|
@ -3777,8 +3679,8 @@
|
|||
}
|
||||
},
|
||||
"set-value": {
|
||||
"version": "0.4.3",
|
||||
"resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz",
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz",
|
||||
"integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
|
|
@ -3938,13 +3840,6 @@
|
|||
"integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=",
|
||||
"dev": true
|
||||
},
|
||||
"window-size": {
|
||||
"version": "0.1.0",
|
||||
"resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz",
|
||||
"integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=",
|
||||
"dev": true,
|
||||
"optional": true
|
||||
},
|
||||
"wordwrap": {
|
||||
"version": "0.0.3",
|
||||
"resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz",
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"name": "lionsoul-ip2region",
|
||||
"version": "0.0.1",
|
||||
"description": "ip database ",
|
||||
"name": "node-ip2region",
|
||||
"version": "1.0.2",
|
||||
"description": "official nodejs client of ip2region",
|
||||
"main": "ip2region.js",
|
||||
"scripts": {
|
||||
"test": "jest",
|
||||
|
|
@ -10,7 +10,7 @@
|
|||
"files": ["data/"],
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/lionsoul2016/ip2region"
|
||||
"url": "https://github.com/lionsoul2014/ip2region"
|
||||
},
|
||||
"keywords": [
|
||||
"ip2region",
|
||||
|
|
@ -20,11 +20,14 @@
|
|||
"author": "dongyado",
|
||||
"license": "ISC",
|
||||
"bugs": {
|
||||
"url": "https://github.com/lionsoul2016/ip2region/issues"
|
||||
"url": "https://github.com/lionsoul2014/ip2region/issues"
|
||||
},
|
||||
"homepage": "https://github.com/lionsoul2016/ip2region",
|
||||
"homepage": "https://github.com/lionsoul2014/ip2region",
|
||||
"devDependencies": {
|
||||
"jest": "^19.0.2",
|
||||
"benchmark": "^2.1.4"
|
||||
},
|
||||
"engines": {
|
||||
"node" : ">=6.0.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
handlebars# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
|
||||
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
|
||||
# yarn lockfile v1
|
||||
|
||||
|
||||
|
|
@ -10,11 +10,11 @@ acorn-globals@^3.1.0:
|
|||
version "3.1.0"
|
||||
resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-3.1.0.tgz#fd8270f71fbb4996b004fa880ee5d46573a731bf"
|
||||
dependencies:
|
||||
acorn "^4.0.4"
|
||||
acorn "^5.7.4"
|
||||
|
||||
acorn@^4.0.4:
|
||||
version "4.0.11"
|
||||
resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.11.tgz#edcda3bd937e7556410d42ed5860f67399c794c0"
|
||||
acorn@^5.7.4:
|
||||
version "5.7.4"
|
||||
resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.4.tgz#edcda3bd937e7556410d42ed5860f67399c794c0"
|
||||
|
||||
ajv@^4.9.1:
|
||||
version "4.11.6"
|
||||
|
|
@ -23,14 +23,6 @@ ajv@^4.9.1:
|
|||
co "^4.6.0"
|
||||
json-stable-stringify "^1.0.1"
|
||||
|
||||
align-text@^0.1.1, align-text@^0.1.3:
|
||||
version "0.1.4"
|
||||
resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117"
|
||||
dependencies:
|
||||
kind-of "^3.0.2"
|
||||
longest "^1.0.1"
|
||||
repeat-string "^1.5.2"
|
||||
|
||||
amdefine@>=0.0.4:
|
||||
version "1.0.1"
|
||||
resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5"
|
||||
|
|
@ -106,10 +98,6 @@ assert-plus@^0.2.0:
|
|||
version "0.2.0"
|
||||
resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234"
|
||||
|
||||
async@^1.4.0:
|
||||
version "1.5.2"
|
||||
resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a"
|
||||
|
||||
async@^2.1.4:
|
||||
version "2.3.0"
|
||||
resolved "https://registry.yarnpkg.com/async/-/async-2.3.0.tgz#1013d1051047dd320fe24e494d5c66ecaf6147d9"
|
||||
|
|
@ -278,6 +266,13 @@ bcrypt-pbkdf@^1.0.0:
|
|||
dependencies:
|
||||
tweetnacl "^0.14.3"
|
||||
|
||||
benchmark@^2.1.4:
|
||||
version "2.1.4"
|
||||
resolved "https://registry.yarnpkg.com/benchmark/-/benchmark-2.1.4.tgz#09f3de31c916425d498cc2ee565a0ebf3c2a5629"
|
||||
dependencies:
|
||||
lodash "^4.17.4"
|
||||
platform "^1.3.3"
|
||||
|
||||
boom@2.x.x:
|
||||
version "2.10.1"
|
||||
resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f"
|
||||
|
|
@ -325,10 +320,6 @@ callsites@^2.0.0:
|
|||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50"
|
||||
|
||||
camelcase@^1.0.2:
|
||||
version "1.2.1"
|
||||
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39"
|
||||
|
||||
camelcase@^3.0.0:
|
||||
version "3.0.0"
|
||||
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a"
|
||||
|
|
@ -337,13 +328,6 @@ caseless@~0.12.0:
|
|||
version "0.12.0"
|
||||
resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
|
||||
|
||||
center-align@^0.1.1:
|
||||
version "0.1.3"
|
||||
resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad"
|
||||
dependencies:
|
||||
align-text "^0.1.3"
|
||||
lazy-cache "^1.0.3"
|
||||
|
||||
chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3:
|
||||
version "1.1.3"
|
||||
resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
|
||||
|
|
@ -358,14 +342,6 @@ ci-info@^1.0.0:
|
|||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.0.0.tgz#dc5285f2b4e251821683681c381c3388f46ec534"
|
||||
|
||||
cliui@^2.1.0:
|
||||
version "2.1.0"
|
||||
resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1"
|
||||
dependencies:
|
||||
center-align "^0.1.1"
|
||||
right-align "^0.1.1"
|
||||
wordwrap "0.0.2"
|
||||
|
||||
cliui@^3.2.0:
|
||||
version "3.2.0"
|
||||
resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d"
|
||||
|
|
@ -398,6 +374,10 @@ combined-stream@^1.0.5, combined-stream@~1.0.5:
|
|||
dependencies:
|
||||
delayed-stream "~1.0.0"
|
||||
|
||||
commander@~2.20.3:
|
||||
version "2.20.3"
|
||||
resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
|
||||
|
||||
concat-map@0.0.1:
|
||||
version "0.0.1"
|
||||
resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
|
||||
|
|
@ -442,7 +422,7 @@ debug@^2.6.9:
|
|||
dependencies:
|
||||
ms "0.7.2"
|
||||
|
||||
decamelize@^1.0.0, decamelize@^1.1.1:
|
||||
decamelize@^1.1.1:
|
||||
version "1.2.0"
|
||||
resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
|
||||
|
||||
|
|
@ -674,14 +654,14 @@ growly@^1.3.0:
|
|||
resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081"
|
||||
|
||||
handlebars@^4.1.2:
|
||||
version "4.1.2"
|
||||
resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.1.2.tgz#2ce4484850537f9c97a8026d5399b935c4ed4ed7"
|
||||
version "4.5.3"
|
||||
resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.5.3.tgz#5cf75bd8714f7605713511a56be7c349becb0482"
|
||||
dependencies:
|
||||
async "^1.4.0"
|
||||
neo-async "^2.6.0"
|
||||
optimist "^0.6.1"
|
||||
source-map "^0.4.4"
|
||||
source-map "^0.6.1"
|
||||
optionalDependencies:
|
||||
uglify-js "^2.6"
|
||||
uglify-js "^3.1.4"
|
||||
|
||||
har-schema@^1.0.5:
|
||||
version "1.0.5"
|
||||
|
|
@ -713,9 +693,13 @@ hawk@~3.1.3:
|
|||
hoek "2.x.x"
|
||||
sntp "1.x.x"
|
||||
|
||||
hoek@^4.2.1:
|
||||
hoek@2.x.x:
|
||||
version "2.16.3"
|
||||
resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed"
|
||||
|
||||
hoek@4.2.1:
|
||||
version "4.2.1"
|
||||
resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.1.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed"
|
||||
resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.1.tgz#9634502aa12c445dd5a7c5734b572bb8738aacbb"
|
||||
|
||||
home-or-tmp@^2.0.0:
|
||||
version "2.0.0"
|
||||
|
|
@ -1153,7 +1137,7 @@ jsdom@^9.11.0:
|
|||
resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-9.12.0.tgz#e8c546fffcb06c00d4833ca84410fed7f8a097d4"
|
||||
dependencies:
|
||||
abab "^1.0.3"
|
||||
acorn "^4.0.4"
|
||||
acorn "^5.7.4"
|
||||
acorn-globals "^3.1.0"
|
||||
array-equal "^1.0.0"
|
||||
content-type-parser "^1.0.1"
|
||||
|
|
@ -1213,10 +1197,6 @@ kind-of@^3.0.2:
|
|||
dependencies:
|
||||
is-buffer "^1.0.2"
|
||||
|
||||
lazy-cache@^1.0.3:
|
||||
version "1.0.4"
|
||||
resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e"
|
||||
|
||||
lcid@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835"
|
||||
|
|
@ -1255,9 +1235,9 @@ lodash@^4.17.13:
|
|||
version "4.17.13"
|
||||
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.13.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae"
|
||||
|
||||
longest@^1.0.1:
|
||||
version "1.0.1"
|
||||
resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097"
|
||||
lodash@^4.17.4:
|
||||
version "4.17.15"
|
||||
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548"
|
||||
|
||||
loose-envify@^1.0.0:
|
||||
version "1.3.1"
|
||||
|
|
@ -1309,19 +1289,23 @@ minimatch@^3.0.2, minimatch@^3.0.3:
|
|||
dependencies:
|
||||
brace-expansion "^1.0.0"
|
||||
|
||||
minimist@0.0.8, minimist@~0.0.1:
|
||||
version "0.0.8"
|
||||
resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
|
||||
minimist@1.2.3:
|
||||
version "1.2.3"
|
||||
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.3.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
|
||||
|
||||
minimist@^1.1.1:
|
||||
version "1.2.0"
|
||||
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
|
||||
minimist@^1.2.3:
|
||||
version "1.2.3"
|
||||
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.3.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
|
||||
|
||||
minimist@~1.2.3:
|
||||
version "1.2.3"
|
||||
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.3.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf"
|
||||
|
||||
mkdirp@^0.5.1:
|
||||
version "0.5.1"
|
||||
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
|
||||
dependencies:
|
||||
minimist "0.0.8"
|
||||
minimist "1.2.3"
|
||||
|
||||
ms@0.7.2:
|
||||
version "0.7.2"
|
||||
|
|
@ -1331,6 +1315,10 @@ natural-compare@^1.4.0:
|
|||
version "1.4.0"
|
||||
resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
|
||||
|
||||
neo-async@^2.6.0:
|
||||
version "2.6.1"
|
||||
resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c"
|
||||
|
||||
node-int64@^0.4.0:
|
||||
version "0.4.0"
|
||||
resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b"
|
||||
|
|
@ -1392,7 +1380,7 @@ optimist@^0.6.1:
|
|||
version "0.6.1"
|
||||
resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686"
|
||||
dependencies:
|
||||
minimist "~0.0.1"
|
||||
minimist "~1.2.3"
|
||||
wordwrap "~0.0.2"
|
||||
|
||||
optionator@^0.8.1:
|
||||
|
|
@ -1493,6 +1481,10 @@ pinkie@^2.0.0:
|
|||
version "2.0.4"
|
||||
resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870"
|
||||
|
||||
platform@^1.3.3:
|
||||
version "1.3.5"
|
||||
resolved "https://registry.yarnpkg.com/platform/-/platform-1.3.5.tgz#fb6958c696e07e2918d2eeda0f0bc9448d733444"
|
||||
|
||||
prelude-ls@~1.1.2:
|
||||
version "1.1.2"
|
||||
resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
|
||||
|
|
@ -1619,12 +1611,6 @@ resolve@^1.2.0:
|
|||
dependencies:
|
||||
path-parse "^1.0.5"
|
||||
|
||||
right-align@^0.1.1:
|
||||
version "0.1.3"
|
||||
resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef"
|
||||
dependencies:
|
||||
align-text "^0.1.1"
|
||||
|
||||
rimraf@^2.4.4:
|
||||
version "2.6.1"
|
||||
resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.1.tgz#c2338ec643df7a1b7fe5c54fa86f57428a55f33d"
|
||||
|
|
@ -1643,7 +1629,7 @@ sane@~1.5.0:
|
|||
exec-sh "^0.2.0"
|
||||
fb-watchman "^1.8.0"
|
||||
minimatch "^3.0.2"
|
||||
minimist "^1.1.1"
|
||||
minimist "^1.2.3"
|
||||
walker "~1.0.5"
|
||||
watch "~0.10.0"
|
||||
|
||||
|
|
@ -1679,16 +1665,14 @@ source-map-support@^0.4.2:
|
|||
dependencies:
|
||||
source-map "^0.5.6"
|
||||
|
||||
source-map@^0.4.4:
|
||||
version "0.4.4"
|
||||
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b"
|
||||
dependencies:
|
||||
amdefine ">=0.0.4"
|
||||
|
||||
source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.1:
|
||||
source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6:
|
||||
version "0.5.6"
|
||||
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412"
|
||||
|
||||
source-map@^0.6.1, source-map@~0.6.1:
|
||||
version "0.6.1"
|
||||
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
|
||||
|
||||
source-map@~0.2.0:
|
||||
version "0.2.0"
|
||||
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.2.0.tgz#dab73fbcfc2ba819b4de03bd6f6eaa48164b3f9d"
|
||||
|
|
@ -1804,6 +1788,12 @@ tough-cookie@^2.3.3:
|
|||
dependencies:
|
||||
punycode "^1.4.1"
|
||||
|
||||
tough-cookie@~2.3.3:
|
||||
version "2.3.4"
|
||||
resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.4.tgz#ec60cee38ac675063ffc97a5c18970578ee83655"
|
||||
dependencies:
|
||||
punycode "^1.4.1"
|
||||
|
||||
tr46@~0.0.3:
|
||||
version "0.0.3"
|
||||
resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a"
|
||||
|
|
@ -1828,18 +1818,12 @@ type-check@~0.3.2:
|
|||
dependencies:
|
||||
prelude-ls "~1.1.2"
|
||||
|
||||
uglify-js@^2.6:
|
||||
version "2.8.22"
|
||||
resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.22.tgz#d54934778a8da14903fa29a326fb24c0ab51a1a0"
|
||||
uglify-js@^3.1.4:
|
||||
version "3.7.3"
|
||||
resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.7.3.tgz#f918fce9182f466d5140f24bb0ff35c2d32dcc6a"
|
||||
dependencies:
|
||||
source-map "~0.5.1"
|
||||
yargs "~3.10.0"
|
||||
optionalDependencies:
|
||||
uglify-to-browserify "~1.0.0"
|
||||
|
||||
uglify-to-browserify@~1.0.0:
|
||||
version "1.0.2"
|
||||
resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7"
|
||||
commander "~2.20.3"
|
||||
source-map "~0.6.1"
|
||||
|
||||
uuid@^3.0.0:
|
||||
version "3.0.1"
|
||||
|
|
@ -1899,14 +1883,6 @@ which@^1.1.1, which@^1.2.12:
|
|||
dependencies:
|
||||
isexe "^2.0.0"
|
||||
|
||||
window-size@0.1.0:
|
||||
version "0.1.0"
|
||||
resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d"
|
||||
|
||||
wordwrap@0.0.2:
|
||||
version "0.0.2"
|
||||
resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f"
|
||||
|
||||
wordwrap@~0.0.2:
|
||||
version "0.0.3"
|
||||
resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107"
|
||||
|
|
@ -1968,12 +1944,3 @@ yargs@^6.3.0:
|
|||
which-module "^1.0.0"
|
||||
y18n "^3.2.1"
|
||||
yargs-parser "^4.2.0"
|
||||
|
||||
yargs@~3.10.0:
|
||||
version "3.10.0"
|
||||
resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1"
|
||||
dependencies:
|
||||
camelcase "^1.0.2"
|
||||
cliui "^2.1.0"
|
||||
decamelize "^1.0.0"
|
||||
window-size "0.1.0"
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
### 安装步骤
|
||||
* git clone https://github.com/lionsoul2014/ip2region.git
|
||||
* cd ip2region
|
||||
* cp binding/php_extension/php5/ip2region 到 php source code 的 ext 目录下
|
||||
* cp binding/php5_ext 到 php source code 的 ext/ip2region 目录下
|
||||
* cp binding/c/ 里面所有的文件到 php source code 的 ext/ip2region/lib 目录下
|
||||
* 在 ext/ip2region 下,运行
|
||||
|
||||
|
|
@ -50,7 +50,7 @@ static zend_class_entry *ip2region_class_entry_ptr;
|
|||
//}
|
||||
|
||||
|
||||
void search(
|
||||
static void search(
|
||||
ip2region_t g_resouce_ptr,
|
||||
uint_t (*func_ptr) (ip2region_t, uint_t, datablock_t),
|
||||
long ip,
|
||||
|
|
@ -182,7 +182,7 @@ PHP_METHOD(ip2region_class_entry_ptr, binarySearch)
|
|||
PHP_MSHUTDOWN_FUNCTION(ip2region)
|
||||
{
|
||||
UNREGISTER_INI_ENTRIES();
|
||||
ip2region_destroy(&g_resource);
|
||||
if(g_resource_ptr != NULL) ip2region_destroy(&g_resource);
|
||||
return SUCCESS;
|
||||
}
|
||||
/* }}} */
|
||||
|
|
@ -256,8 +256,8 @@ PHP_MINIT_FUNCTION(ip2region)
|
|||
ZEND_INIT_MODULE_GLOBALS(ip2region, php_ip2region_init_globals, NULL);
|
||||
REGISTER_INI_ENTRIES();
|
||||
|
||||
|
||||
if (ip2region_create( &g_resource, IP2REGION_G(db_file)) == 0)
|
||||
char* _db_file = IP2REGION_G(db_file);
|
||||
if ( _db_file == NULL || ip2region_create( &g_resource, _db_file) == 0)
|
||||
{
|
||||
g_resource_ptr = NULL;
|
||||
} else {
|
||||
|
|
@ -65,7 +65,6 @@ static void php_ip2region_init_globals(zend_ip2region_globals *);
|
|||
#define le_ip2region_name "Ip2region"
|
||||
|
||||
|
||||
void search( ip2region_t, uint_t (*func_ptr) (ip2region_t, uint_t, datablock_t), long , zval **, datablock_t);
|
||||
|
||||
#endif /* PHP_IP2REGION_H */
|
||||
/*
|
||||
|
|
@ -3,7 +3,7 @@
|
|||
### 安装步骤
|
||||
* git clone https://github.com/lionsoul2014/ip2region.git
|
||||
* cd ip2region
|
||||
* cp binding/php_extension/php7/ip2region 到 php source code 的 ext 目录下
|
||||
* cp binding/php7_ext 到 php source code 的 ext/ip2region 目录下
|
||||
* cp binding/c/ 里面所有的文件到 php source code 的 ext/ip2region/lib 目录下
|
||||
* 在 ext/ip2region 下,运行
|
||||
|
||||
|
|
@ -50,7 +50,7 @@ static zend_class_entry *ip2region_class_entry_ptr;
|
|||
//}
|
||||
|
||||
|
||||
void search(
|
||||
static void search(
|
||||
ip2region_t g_resouce_ptr,
|
||||
uint_t (*func_ptr) (ip2region_t, uint_t, datablock_t),
|
||||
long ip,
|
||||
|
|
@ -188,7 +188,7 @@ PHP_METHOD(ip2region_class_entry_ptr, binarySearch)
|
|||
PHP_MSHUTDOWN_FUNCTION(ip2region)
|
||||
{
|
||||
UNREGISTER_INI_ENTRIES();
|
||||
ip2region_destroy(&g_resource);
|
||||
if( g_resource_ptr != NULL ) ip2region_destroy(&g_resource);
|
||||
return SUCCESS;
|
||||
}
|
||||
/* }}} */
|
||||
|
|
@ -262,8 +262,8 @@ PHP_MINIT_FUNCTION(ip2region)
|
|||
ZEND_INIT_MODULE_GLOBALS(ip2region, php_ip2region_init_globals, NULL);
|
||||
REGISTER_INI_ENTRIES();
|
||||
|
||||
|
||||
if (ip2region_create( &g_resource, IP2REGION_G(db_file)) == 0)
|
||||
char* _db_file = IP2REGION_G(db_file);
|
||||
if ( _db_file == NULL || ip2region_create( &g_resource, _db_file) == 0)
|
||||
{
|
||||
g_resource_ptr = NULL;
|
||||
} else {
|
||||
|
|
@ -65,7 +65,6 @@ static void php_ip2region_init_globals(zend_ip2region_globals *);
|
|||
#define le_ip2region_name "Ip2region"
|
||||
|
||||
|
||||
void search( ip2region_t, uint_t (*func_ptr) (ip2region_t, uint_t, datablock_t), long , zval **, datablock_t);
|
||||
|
||||
#endif /* PHP_IP2REGION_H */
|
||||
/*
|
||||
|
|
@ -28,7 +28,7 @@ version = "*"
|
|||
|
||||
取消上面 toml 的 `# features = ["lazy"]` 行的注释即可使用,其 api 是 `memory_search` 和 `memory_search_ip`。
|
||||
|
||||
只是目前 DB 足有3.2M,还是有些感人的。
|
||||
只是目前 DB 只有3.2M,还是有些感人的。
|
||||
|
||||
关键的一行是 `features = ["lazy"]` ,不需要则可以注释或者删掉。
|
||||
|
||||
|
|
|
|||
377986
data/ip.merge.txt
377986
data/ip.merge.txt
File diff suppressed because it is too large
Load Diff
Binary file not shown.
Loading…
Reference in New Issue