编程开源技术交流,分享技术与知识

网站首页 > 开源技术 正文

服务端如何部署IP定位服务(服务端ip地址是什么意思)

wxchong 2024-07-08 01:00:45 开源技术 12 ℃ 0 评论

本文讲解的IP定位服务主要是利用PHP+纯真IP数据库来讲IP转换为地理位置。

1.纯真IP数据库下载地址:http://www.cz88.net/,可以下一个window版本,解压后会有一个qqwry.dat的数据文件。

纯真IP数据库下载位置

2.PHP调用姿势

1)封装好的类库

<?php

class ipAddress

{

private $fp;

private $firstip;

private $lastip;

private $totalip;

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;

register_shutdown_function(array(&$this, "__destruct"));

}

}

public function __destruct()

{

if ($this->fp) {

@fclose($this->fp);

}

$this->fp = 0;

}

private function getlong()

{

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

return $result["long"];

}

private function getlong3()

{

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

return $result["long"];

}

private function packip($ip)

{

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

}

private function getstring($data = "")

{

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

while (ord($char) > 0) {

$data .= $char;

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

}

return $data;

}

private function getarea()

{

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

switch (ord($byte)) {

case 0:

$operators = "";

break;

case 1:

case 2:

fseek($this->fp, $this->getlong3());

$operators = $this->getstring();

break;

default:

$operators = $this->getstring($byte);

break;

}

return $operators;

}

public function getlocation($ip)

{

if (!$this->fp) {

return null;

}

$location["ip"] = gethostbyname($ip);

$ip = $this->packip($location["ip"]);

$l = 0;

$u = $this->totalip;

$findip = $this->lastip;

while ($l <= $u) {

$i = floor(($l + $u) / 2);

fseek($this->fp, $this->firstip + $i * 7);

$startip = strrev(fread($this->fp, 4));

if ($ip < $startip) {

$u = $i - 1;

} else {

fseek($this->fp, $this->getlong3());

$endip = strrev(fread($this->fp, 4));

if ($ip > $endip) {

$l = $i + 1;

} else {

$findip = $this->firstip + $i * 7;

break;

}

}

}

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

$location["startip"] = long2ip($this->getlong());

$offset = $this->getlong3();

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

$location["endip"] = long2ip($this->getlong());

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

switch (ord($byte)) {

case 1:

$countryOffset = $this->getlong3();

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

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

switch (ord($byte)) {

case 2:

fseek($this->fp, $this->getlong3());

$location["area"] = $this->getstring();

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

$location["operators"] = $this->getarea();

break;

default:

$location["area"] = $this->getstring($byte);

$location["operators"] = $this->getarea();

break;

}

break;

case 2:

fseek($this->fp, $this->getlong3());

$location["area"] = $this->getstring();

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

$location["operators"] = $this->getarea();

break;

default:

$location["area"] = $this->getstring($byte);

$location["operators"] = $this->getarea();

break;

}

if ($location["area"] == "CZ88.NET") {

$location["area"] = "未知";

}

if ($location["operators"] == "CZ88.NET") {

$location["operators"] = "未知";

}

return $location;

}

}

2)调用姿势

<?php

$ip='42.63.135.123';

require_once './ipAddress.php';

$setip=new ipAddress("./qqwry.dat");

$location=$setip->getlocation($ip);

$str=$location['area'];

$str=iconv("gb2312", "utf-8//IGNORE",$str);

var_dump($str);

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表