php调用纯真ip,php调用纯真IP数据库进行IP定位

调用纯真IP数据库进行IP定位 使用exec函数调用系统Ping服务 支持linux与windows双系统运行 json格式数据回调,支持最大、最小、平均延迟返回

/*

*调用系统进行ping动作

资源来自网络

由Youngxj整理

状态码:1000->成功,1001->error,1002->禁ping,1003->找不到主机

*

*/

header("Content-type: text/html; charset=gbk");

header("Access-Control-Allow-Origin:*");

header('Content-type: application/json');

error_reporting(0);

$nodeip = 'xxx.xxx.xxx.xxx'; //填写你的服务器IP

$nodetext = '1'; //自定义文字支持html

if (isset($_GET['host']) && $_GET["host"] != "") {$url = $_GET['host'];

preg_match("/^(\w+:\/\/)?([^\/]+)/i", $url , $matches);

// 获得主机名$host = $matches[2];

}else{error();}

//获取当前服务器ip地区

$node = convertip($nodeip);

//编码转换

$nodetext = mb_convert_encoding($nodetext,"UTF-8","GBK");

if (PATH_SEPARATOR==':'){ // linuxexec("ping -c 2 -w 5 $host", $info);

$strs = reset($info);

$ping_time_line = end($info);

preg_match_all("/\((.*?)\)/",$strs,$str); //正则首行获取的ip

$ip =$str[1][0];

if($info[1]!=""){ //正常输出的内容

$ping_time = explode("=", $ping_time_line)[1];

$ping_time_min = explode("/", $ping_time)[0];

$ping_time_avg = explode("/", $ping_time)[1];

$ping_time_max = explode("/", $ping_time)[2];

$location = convertip($ip);

$arr = array("host"=>$host,"ip"=>$ip,"location"=>$location,"ping_time_min"=>$ping_time_min.'ms',"ping_time_avg"=>$ping_time_avg.'ms',"ping_time_max"=>$ping_time_max.'ms',"state"=>"1000","node"=>$node,'nodetext'=>$nodetext);

echo json_encode($arr); //location:域名节点地址,ping_time_min:最小延迟,ping_time_avg:平均延迟,ping_time_max:最大延迟,node:该服务器地区,nodetext:自定义文字

}elseif(empty($ip)){ //获取不到ip同时获取不到主机,说明当前地址错误或者未解析

error();

}else{ //禁Ping时输出的内容

$title = explode(' ', $strs);

$location = convertip($ip);

$arr = array("host"=>$host,"ip"=>$ip,"location"=>$location,"state"=>"1002","title"=>$title[1],"node"=>$node,'nodetext'=>$nodetext);

echo json_encode($arr);

//location:域名节点地址,title:返回特殊地址,node:该服务器地区,nodetext:自定义文字

}

}

else{ // windowsexec("ping $host", $info);

if($info[0]!=''){

$arr = array("host"=>$host,"state"=>"1003","title"=>"请求找不到主机");

echo json_encode($arr);

exit();

}

//获取ip正则

$strs = $info[1];

preg_match_all("/\[(.*?)\]/",$strs,$str);

$ip =$str[1][0];

//获取ping值结果

$info_time = end($info);

$target = $info[2];

$info_times = explode(" ",$info_time);

$min_time = str_replace(",最长","",$info_times[6]);

$max_time = str_replace(",平均","",$info_times[8]);

$avg_time = str_replace(",最长","",$info_times[10]);

//判断是否有ping值结果$result = checkStr("ms",$info_time);

if($result){

$location = convertip($ip);

$arr = array("host"=>$host,"ip"=>$ip,"location"=>$location,"ping_time_min"=>$min_time,"ping_time_avg"=>$avg_time,"ping_time_max"=>$max_time,"state"=>"1000","node"=>$node,'nodetext'=>$nodetext);

echo json_encode($arr); //location:域名节点地址,ping_time_min:最小延迟,ping_time_avg:平均延迟,ping_time_max:最大延迟,node:该服务器地区,nodetext:自定义文字

}elseif(empty($ip)){ //获取不到ip同时获取不到主机,说明当前地址错误或者未解析

error();

}else{ //禁Ping时输出的内容

$location = convertip($ip);

$arr = array("host"=>$host,"ip"=>$ip,"location"=>$location,"state"=>"1002","node"=>$node,'nodetext'=>$nodetext);

echo json_encode($arr); //location:域名节点地址,node:该服务器地区,nodetext:自定义文字

}

}

function error(){$host = $_GET['host'];

$arr = array("host"=>"$host","state"=>"1001");

echo json_encode($arr);

exit;

}

function convertip($ip) {

//纯真IP数据库IP定位$dat_path = 'qqwry.dat';

if(!$fd = @fopen($dat_path, 'rb')){

return 'IP数据库文件不存在或者禁止访问或者已经被删除!';

}

$ip = explode('.', $ip);

$ipNum = $ip[0] * 16777216 + $ip[1] * 65536 + $ip[2] * 256 + $ip[3];

$DataBegin = fread($fd, 4);

$DataEnd = fread($fd, 4);

$ipbegin = implode('', unpack('L', $DataBegin));

if($ipbegin < 0) $ipbegin += pow(2, 32);

$ipend = implode('', unpack('L', $DataEnd));

if($ipend < 0) $ipend += pow(2, 32);

$ipAllNum = ($ipend - $ipbegin) / 7 + 1;

$BeginNum = 0;

$EndNum = $ipAllNum;

while($ip1num>$ipNum || $ip2num

$Middle= intval(($EndNum + $BeginNum) / 2);

fseek($fd, $ipbegin + 7 * $Middle);

$ipData1 = fread($fd, 4);

if(strlen($ipData1) < 4) {

fclose($fd);

return '系统出错!';

}

$ip1num = implode('', unpack('L', $ipData1));

if($ip1num < 0) $ip1num += pow(2, 32);

if($ip1num > $ipNum) {

$EndNum = $Middle;

continue;

}

$DataSeek = fread($fd, 3);

if(strlen($DataSeek) < 3) {

fclose($fd);

return '系统出错!';

}

$DataSeek = implode('', unpack('L', $DataSeek.chr(0)));

fseek($fd, $DataSeek);

$ipData2 = fread($fd, 4);

if(strlen($ipData2) < 4) {

fclose($fd);

return '系统出错!';

}

$ip2num = implode('', unpack('L', $ipData2));

if($ip2num < 0) $ip2num += pow(2, 32);

if($ip2num < $ipNum) {

if($Middle == $BeginNum) {

fclose($fd);

return '未知';

}

$BeginNum = $Middle;

}

}

$ipFlag = fread($fd, 1);

if($ipFlag == chr(1)) {

$ipSeek = fread($fd, 3);

if(strlen($ipSeek) < 3) {

fclose($fd);

return '系统出错!';

}

$ipSeek = implode('', unpack('L', $ipSeek.chr(0)));

fseek($fd, $ipSeek);

$ipFlag = fread($fd, 1);

}

if($ipFlag == chr(2)) {

$AddrSeek = fread($fd, 3);

if(strlen($AddrSeek) < 3) {

fclose($fd);

return '系统出错!';

}

$ipFlag = fread($fd, 1);

if($ipFlag == chr(2)) {

$AddrSeek2 = fread($fd, 3);

if(strlen($AddrSeek2) < 3) {

fclose($fd);

return '系统出错!';

}

$AddrSeek2 = implode('', unpack('L', $AddrSeek2.chr(0)));

fseek($fd, $AddrSeek2);

} else {

fseek($fd, -1, SEEK_CUR);

}

while(($char = fread($fd, 1)) != chr(0))

$ipAddr2 .= $char;

$AddrSeek = implode('', unpack('L', $AddrSeek.chr(0)));

fseek($fd, $AddrSeek);

while(($char = fread($fd, 1)) != chr(0))

$ipAddr1 .= $char;

} else {

fseek($fd, -1, SEEK_CUR);

while(($char = fread($fd, 1)) != chr(0))

$ipAddr1 .= $char;

$ipFlag = fread($fd, 1);

if($ipFlag == chr(2)) {

$AddrSeek2 = fread($fd, 3);

if(strlen($AddrSeek2) < 3) {

fclose($fd);

return '系统出错!';

}

$AddrSeek2 = implode('', unpack('L', $AddrSeek2.chr(0)));

fseek($fd, $AddrSeek2);

} else {

fseek($fd, -1, SEEK_CUR);

}

while(($char = fread($fd, 1)) != chr(0)){

$ipAddr2 .= $char;

}

}

fclose($fd);

if(preg_match('/http/i', $ipAddr2)) {

$ipAddr2 = '';

}

$ipaddr = "$ipAddr1 $ipAddr2";

$ipaddr = preg_replace('/CZ88.Net/is', '', $ipaddr);

$ipaddr = preg_replace('/^s*/is', '', $ipaddr);

$ipaddr = preg_replace('/s*$/is', '', $ipaddr);

if(preg_match('/http/i', $ipaddr) || $ipaddr == '') {

$ipaddr = '未知';

}

$ipaddr = iconv('gbk', 'utf-8//IGNORE', $ipaddr);

if( $ipaddr != ' ' )

return $ipaddr;

else

$ipaddr = '来自火星,无法或者其所在地!';

return $ipaddr;

}

function checkStr($str,$target){

//字符串是否存在正则$tmpArr = explode($str,$target);

if(count($tmpArr)>1)return true;

else return false;

}

?>

如果文章或资源对您有帮助,欢迎打赏作者。一路走来,感谢有您!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值