PHP读取纯真IP地址数据库

<?php
/*--------------------------------------------------
	ip2address [qqwry.dat]
--------------------------------------------------*/
class ip {
	var $fh; //IP数据库文件句柄

	var $first; //第一条索引

	var $last; //最后一条索引

	var $total; //索引总数

	//构造函数

	function __construct() {

		$this->fh = fopen(‘qqwry.dat‘, ‘rb‘); //qqwry.dat文件

		$this->first = $this->getLong4();

		$this->last = $this->getLong4();

		$this->total = ($this->last - $this->first) / 7; //每条索引7字节

	}

	//检查IP合法性

	function checkIp($ip) {

		$arr = explode(‘.‘,$ip);

		if(count($arr) !=4 ) {

			return false;

		} else {

			for ($i=0; $i < 4; $i++) {

				if ($arr[$i] <‘0‘ || $arr[$i] > ‘255‘) {

					return false;

				}

			}

		}

		return true;

	}

	function getLong4() {

		//读取little-endian编码的4个字节转化为长整型数

		$result = unpack(‘Vlong‘, fread($this->fh, 4));

		return $result[‘long‘];

	}

	function getLong3() {

		//读取little-endian编码的3个字节转化为长整型数

		$result = unpack(‘Vlong‘, fread($this->fh, 3).chr(0));

		return $result[‘long‘];

	}

	//查询信息

	function getInfo($data = "") {

		$char = fread($this->fh, 1);

		while (ord($char) != 0) { //国家地区信息以0结束

			$data .= $char;

			$char = fread($this->fh, 1);

		}

		return $data;

	}

	//查询地区信息

	function getArea() {

		$byte = fread($this->fh, 1); //标志字节

		switch (ord($byte)) {

			case 0: $area = ‘‘; break; //没有地区信息

			case 1: //地区被重定向

				fseek($this->fh, $this->getLong3());

				$area = $this->getInfo(); break;

			case 2: //地区被重定向

			fseek($this->fh, $this->getLong3());

			$area = $this->getInfo(); break;

			default: $area = $this->getInfo($byte);  break; //地区没有被重定向

		}

		return $area;

	}

	function ip2addr($ip) {

		if(!$this -> checkIp($ip)){

			return false;

		}

		$ip = pack(‘N‘, intval(ip2long($ip)));

		//二分查找

		$l = 0;

		$r = $this->total;

		while($l <= $r) {

			$m = floor(($l + $r) / 2); //计算中间索引

			fseek($this->fh, $this->first + $m * 7);

			$beginip = strrev(fread($this->fh, 4)); //中间索引的开始IP地址

			fseek($this->fh, $this->getLong3());

			$endip = strrev(fread($this->fh, 4)); //中间索引的结束IP地址

			if ($ip < $beginip) { //用户的IP小于中间索引的开始IP地址时

				$r = $m - 1;

			} else {

				if ($ip > $endip) { //用户的IP大于中间索引的结束IP地址时

					$l = $m + 1;

				} else { //用户IP在中间索引的IP范围内时

					$findip = $this->first + $m * 7;

					break;

				}

			}

		}

		//查询国家地区信息

		fseek($this->fh, $findip);

		$location[‘beginip‘] = long2ip($this->getLong4()); //用户IP所在范围的开始地址

		$offset = $this->getlong3();

		fseek($this->fh, $offset);

		$location[‘endip‘] = long2ip($this->getLong4()); //用户IP所在范围的结束地址

		$byte = fread($this->fh, 1); //标志字节

		switch (ord($byte)) {

			case 1:  //国家和区域信息都被重定向

				$countryOffset = $this->getLong3(); //重定向地址

				fseek($this->fh, $countryOffset);

				$byte = fread($this->fh, 1); //标志字节

				switch (ord($byte)) {

					case 2: //国家信息被二次重定向

						fseek($this->fh, $this->getLong3());

						$location[‘country‘] = $this->getInfo();

						fseek($this->fh, $countryOffset + 4);

						$location[‘area‘] = $this->getArea();

						break;

					default: //国家信息没有被二次重定向

						$location[‘country‘] = $this->getInfo
($byte);
						$location[‘area‘] = $this->getArea();

						break;

				}

				break;

			case 2: //国家信息被重定向

				fseek($this->fh, $this->getLong3());

				$location[‘country‘] = $this->getInfo();

				fseek($this->fh, $offset + 8);

				$location[‘area‘] = $this->getArea();

				break;

			default: //国家信息没有被重定向

				$location[‘country‘] = $this->getInfo($byte);

				$location[‘area‘] = $this->getArea();

				break;

		}

		//gb2312 to utf-8(去除无信息时显示的CZ88.NET)

		foreach ($location as $k => $v) {

			$location[$k] = str_replace(‘CZ88.NET‘,‘‘,iconv(‘gb2312‘, ‘utf-8‘, $v));

		}

		return $location;

	}

	//析构函数

	function __destruct() {

		fclose($this->fh);

	}

}

$ip = new ip();

$addr = $ip -> ip2addr(‘IP地址‘);

print_r($addr);

?>
时间: 2024-10-03 13:47:48

PHP读取纯真IP地址数据库的相关文章

Python读取纯真IP数据库

一.获取最新版IP地址数据库qqwry.dat 纯真IP地址数据库下载地址:http://update.cz88.net/soft/setup.zip 在windows机器上下载解压,点击setup.exe安装,在安装目录下的qqwry.dat即是最新版ip数据库. 也可从51CTO下载(不是最新版,可用于测试):http://down.51cto.com/data/1888530 二.IPLocator.py 网上找到别人用Python写的纯真IP数据库的查询程序,原文地址:http://bl

解析纯真IP地址库

一周以来,一直在做 IP地址库的解析.从调研到编码到优化,大概花了有七八天的时间.感觉很好玩.总结一下整个做的过程. 1.关于IP 地址库的解析方式 目前主要的解析方式有两种:通过API,或通过IP数据库. API方式很简单,目前国内大厂不少提供API接口,只要发送请求的IP,就能获得相应的地理位置.像BAT等等公司都提供IP查询接口.这种解析方式的好处在于,编码简单,一个请求获得数据,然后解析一下就好了(通常只是个json数据),而且不用维护数据库,对本地没有负担.但是缺点也挺明显的,首先是慢

JS读取本地IP地址信息

HTML <div> <p>点击下面的按钮,查看本地IP信息</p> <span class="span">点击查看</span> <p class="cip"></p> <p class="cid"></p> <p class="cname"></p> </div> CSS html

自定义Nginx日志格式获取IP地址的省市份信息

注:图片如果损坏,点击文章链接:https://www.toutiao.com/i6806672112477012493/ 在linux中nginx日志产生的格式是下面的配置: $remote_addr^A$msec^A$http_host^A$request_uri 然后准备好了获取的日志数据 创建工程编写代码: 创建执行类和方法 基本结构 创建一个日期处理的工具类 完成简单的IP和时间存放 判断请求参数,利用?判断 如果请求的日志信息拿不到 也没有必要获取其它信息了 将请求信息获取的处理方法

最新手机号段归属地,IP地址归属地数据库

最新手机号段归属地数据库-购买  http://qqzeng.com IP地址数据库-代码   SDK API 多语言解析Dat 导入数据库脚本 https://github.com/zengzhan/qqzeng-ip IP地址数据库-最新   微信 qqzeng-ip官网 http://qqzeng.com演示 http://qqzeng.com/ip

PHP获取IP地址及根据IP判断城市实现城市切换或跳转

PHP获取IP地址 这个比较简单了,利用PHP自带函数就可以了,PHP中文手册看一下,都有现成的例子,就不过多说明了,直接上代码,A段: ? <? //PHP获取当前用户IP地址方法 $xp_UserIp = ($_SERVER["HTTP_VIA"]) ? $_SERVER["HTTP_X_FORWARDED_FOR"] : $_SERVER["REMOTE_ADDR"]; $xp_UserIp = ($xp_UserIp) ? $xp_

几个常用的IP地址归属地查询

几个常用的IP地址归属地查询 原文作者:小伙伴 地址:http://www.it163.org/post/118fd1_7c4073   在做网站开发的时候经常会遇到一些IP检测方面的问题.比如说,根据用户IP所在的地理位置跳转到不同的站点,或者是一些天气预报之类的小插件等等这些问题都需要判断用户地理位置! 发现好多程序员和我以前的做法基本上是相同的,都是读取纯真IP库的数据来判断!但是,用了一段时间发现,纯真的数据错误的确挺多的,还有就是那么 大的一个DAT文件确实很鸡肋!最近经测试发现其实调

[备用]Ip地址库

基于redis的IP地址快速查询 C# IP地址与长整型数据的相互转换 纯真IP地址库:http://www.cz88.net/,下载后安装.解压,就可得Ip地址的txt文件

如何通过一个编程获得IP地址归属地的最简单办法

有时在网站应用程序中要显示对方的IP地址与它的归属地,一般来说,有下列几种办法.1, 采用IP地址数据库.本地查询     这个办法的优点是:查询速度最快,不依赖于外部网站.    缺点是:要编写一定的数据库查询代码,而且你的数据库如果不是很新,则某些IP的查询结果会不正确.        (有需要的可以在此留言,大虾米可以提供一个能找到的最新的IP地址库)2,采用WebService查询.       这里有一个最好的WebService      http://www.webxml.com.