为PHP增加纯真IP数据库(qqwry)支持https://blog.jiqila.com/post/229/

 当我们的网站需要根据IP来查询IP来源时,我们需要一个IP数据库,而国内最好的IP数据库当属“纯真IP数据库”了。为了读取“纯真IP数据库”中的数据,一般情况下我们需要写一段PHP程序,而目前Discuz!中就有这样的PHP代码,我们可以直接拿来使用。这样的做法对于一般网站来说已经够用了,但是对于计数器网站,有大量的IP查询事务,这时候使用纯PHP代码的方式就显得效率低下了。有没有更高效的方法呢?答案当然是肯定的。国内就有人写出了这样的PHP扩展,并且此扩展已经登录在PECL网站了。此扩展的名字叫做QQWRY,网站地址:http://http://pecl.php.net/package/qqwry/。


  qqwry的安装

  qqwry的安装方法与一般PHP扩展的安装方法一样:

引用
wget http://pecl.php.net/get/qqwry-0.1.0.tgz
tar zxvf qqwry-0.1.0.tgz
cd qqwry-0.1.0
./configure --with-php-config=/usr/local/php/bin/php-config
make
make install


  然后在php.ini中加入qqwry支持
引用
extension = "qqwry.so"


  然后,重启php即可实现PHP的纯真IP数据库支持了。相比纯PHP代码的实现,此扩展的效率是其的6至10倍。


   qqwry的使用

  使用方法很简单,首先就是实例化,传入纯真数据库的文件路径,然后调用q方法。该方法返回一个数组,第一个值为所属区域,第二个值为更详细的地址。下面的iconv是把数据从GB2312转到UTF-8,如果你的站点是用GB2312,那么这一步是不需要的。
引用
$qqwry=new qqwry('QQWry.Dat');

list($addr1,$addr2)=$qqwry->q('127.0.0.1');
$addr1=iconv('GB2312','UTF-8',$addr1);
$addr2=iconv('GB2312','UTF-8',$addr2);
echo $addr1,'|',$addr2,"/n";

$arr=$qqwry->q('222.216.47.4');
$arr[0]=iconv('GB2312','UTF-8',$arr[0]);
$arr[1]=iconv('GB2312','UTF-8',$arr[1]);
echo $arr[0],'|',$arr[1],"/n";

$arr=$qqwry->q('64.233.187.99');
$arr[0]=iconv('GB2312','UTF-8',$arr[0]);
$arr[1]=iconv('GB2312','UTF-8',$arr[1]);
echo $arr[0],'|',$arr[1],"/n";


  输出如下:
引用
本机地址|
广西南宁市|(青秀区)电信ADSL
美国|加利福尼亚州Google公司

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
纯真IP数据库是一个常用的IP地理位置查询工具,用于根据IP地址查询对应的地区名。该数据库纯真网络发布,包含了大量的IP地址段及其对应的地理位置信息。使用PHP编程语言可以通过以下步骤来查询IP地址对应的地区名: 1. 首先,需要将纯真IP数据库文件(通常是QQWry.dat)下载并存储在服务器上。 2. 使用PHP的文件操作函数(例如fopen和fread)来打开并读取数据库文件,获取其中的内容。 3. 解析读取到的数据库内容,根据IP地址对应的起始和结束位置,使用二分查找等算法来确定目标IP地址所在的位置。 4. 根据确定的位置,提取出对应的地区名信息。 以下是一个简单的示例代码,实现了根据IP地址查询地区名的功能: ```php <?php function searchRegion($ip) { $path = 'QQWry.dat'; $fp = fopen($path, 'rb'); $content = fread($fp, filesize($path)); $start = unpack('V', $content[0] . $content[1] . $content[2] . $content[3])[1]; $end = unpack('V', $content[4] . $content[5] . $content[6] . $content[7])[1]; $ip = pack('N', intval(ip2long($ip))); while ($start <= $end) { $mid = floor(($start + $end) / 2); fseek($fp, $mid * 7); $data = fread($fp, 7); $ipStart = implode('.', array_map('ord', str_split(substr($data, 0, 4)))); if ($ip < $ipStart) { $end = $mid - 1; } else { $offset = unpack('V', substr($data, 4, 3) . chr(0))[1]; if ($offset == 0) { return '未知地区'; } fseek($fp, $offset); $data = fread($fp, 4); if (substr($data, 0, 1) == chr(0x01)) { $offset = unpack('V', substr($data, 1, 3))[1]; fseek($fp, $offset); $data = fread($fp, 3); } return iconv('gbk', 'utf-8', $data); } } return '未知地区'; } ``` 以上代码使用了二分查找算法,在纯真IP数据库中查找目标IP地址所在位置,并返回对应的地区名(使用了GBK到UTF-8的字符编码转换)。当查询的IP地址在数据库中不存在时,将返回"未知地区"。 希望以上解答可以帮助到您!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值