解析php根据ip查询所在地区

解析php根据ip查询所在地区

dat文件,关于ip对应地区的信息文件

qqwry.dat文件

网上自己下载

class类文件,解析qqwry.data文件的

IpLocation.php文件

复制代码 代码如下:

<?php

class IpLocation {

/**

* @var resource 指针

*/

private $fp;

/**

* 第一条IP记录的偏移地址

* @var int

*/

private $firstip;

/**

* 最后一条IP记录的偏移地址

* @var int

*/

private $lastip;

/**

* IP记录的总条数(不包含版本信息记录)

* @var int

*/

private $totalip;

/**

* 构造函数,打开 QQWry.Dat 文件并初始化类中的信息

* @param string $filename

* @return IpLocation

*/

public function __construct($filename = "qqwry.dat") {

$this->fp = 0;

if (($this->fp = @fopen($filename, 'rb')) !== false) {

$this->firstip = $this->getlong();

$this->lastip = $this->getlong();

$this->totalip = ($this->lastip - $this->firstip) / 7;

}

}

/**

* 返回读取的长整型数

* @access private

* @return int

*/

public function getlong() {

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

$result = unpack('Vlong', fread($this->fp, 4));

return $result['long'];

}

/**

* 返回读取的3个字节的长整型数

*

* @access private

* @return int

*/

public function getlong3() {

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

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

return $result['long'];

}

/**

* 返回压缩后可进行比较的IP地址

*

* @access private

* @param string $ip

* @return string

*/

public function packip($ip) {

// 将IP地址转化为长整型数,如果在PHP5中,IP地址错误,则返回False,

// 这时intval将Flase转化为整数-1,之后压缩成big-endian编码的字符串

return pack('N', intval(ip2long($ip)));

}

/**

* 返回读取的字符串

*

* @access private

* @param string $data

* @return string

*/

public function getstring($data = "") {

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

while (ord($char) > 0) { // 字符串按照C格式保存,以