日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

利用纯真QQIP数据库做快速IP归属地查询_PHP

發布時間:2023/12/15 综合教程 36 生活家
生活随笔 收集整理的這篇文章主要介紹了 利用纯真QQIP数据库做快速IP归属地查询_PHP 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

利用純真版IP數據文件,優化查詢方法,提高格式轉換效率,減少讀取文件的次數,達到快速在線查詢IP的目的。大幅度減少文件讀取次數,對保護服務器硬盤應該有一定的好處。并增加一個數據庫瀏覽器,可以瀏覽純真版QQIP數據文件。

1.用ip2long()做IP校驗
2.用sprintf做強制轉換
3.用unpack分析二進制數據,減少了 文件讀取次數
4.substr strpos分析字符串,這也減少了文件讀取次數
5.可惜速度沒有明顯提高;)

IP Address:Submit

<?php
define('IPDATA','ipdata.db');
//get ip
$ip = isset($_GET['ip'])?$_GET['ip']:getenv("REMOTE_ADDR");
echo "IP: ARIN";
if (-1 === ($ip = ip2long($ip))) die("Invalid IP");
$ip = sprintf("%u",$ip);
$country = $city = '';
echo "
Record No:".Whois($ip,$country,$city);
echo "
Location: []";

function Whois($ip,&$country,&$city)
{
//open ip-database
if (NULL == ($fp = fopen(IPDATA, "rb"))) die("cannot open dbfile.");
//get data section offset
$offset = unpack("Vbegin/Vend", fread($fp, 8));
$begin = 0;$end = ($offset['end'] - $offset['begin']) / 7;
//seek index
while ($begin < $end - 1) {
$num = ($begin + $end) >> 1;
fseek ($fp , ($offset['begin'] + $num * 7) , SEEK_SET ) ;
$record = unpack("Vip", fread($fp, 4));
$record['ip'] = sprintf("%u",$record['ip']);
if ($ip == $record['ip']) { $begin = $num; break;}
if ($ip > $record['ip']) $begin = $num;
else $end = $num;
}
//read index
$record = unpack("Vbeginip/Vloc", ReadBinary($fp,$offset['begin']+$begin*7) );
$locoff =($record['loc'] & 0x00FFFFFF);
$info = unpack("Vendip/Vloc",ReadBinary($fp,$locoff)) ;
$info['endip'] = sprintf("%u",$info['endip']);
if($info['endip'] < $ip) die(" [unkown location]");
//get GEO
$countryoff = (($info['loc'] & 0x000000FF)== 1)?($info['loc'] >> 8):($locoff+4);
$country = ReadGEOStr($fp,$countryoff);
$city = ReadGEOStr($fp,$countryoff);
return $begin;
}

function ReadGEOStr($fp,&$offset)
{
$binarydata = ReadBinary($fp,$offset);
$info = unpack("Vloc",$binarydata);
if( ($info['loc'] & 0x000000FF) == 2 ) {
$GeoStr = ReadBinary($fp,$info['loc'] >> 8 );
$GeoStr = substr($GeoStr,0,strpos($GeoStr, 0));
$offset += 4;
}else {
$len = strpos($binarydata, 0);
$GeoStr = substr($binarydata,0,$len);
$offset += $len + 1;
}
return $GeoStr;
}

function ReadBinary($fp,$positionz)
{
fseek ( $fp , $positionz , SEEK_SET ) ;
return fread ( $fp , 32 ) ;
}
?>
===================================

2005-02-22
cnss格式QQ數據庫
集成PHP瀏覽查詢器
集成官方whois查詢 http://www.mydot.org/t539.html

IP Address:
Submit

Start
Count
Submit

<?php
define('IPDATA','ipdata.db');

$fp = NULL;
if( isset($_GET['ip']) )
{
$ipx = $_GET['ip'];
if (-1 === ($ip = ip2long($ipx))) die("Invalid IP");
echo "IP: ARIN";
$ip = sprintf("%u",$ip);
$ippostion = '';
$start_time=get_time();
echo "
Record No:".Whois($ippostion);
$end_time=get_time();
echo "
Location:";
echo "
Process Time:".round($end_time-$start_time,3)."seconds";
}
else if ( isset($_GET['s']) )
{
$first = $_GET['s'];
$rcount = $_GET['c'];
$startoff = $end = 0;
GetSection($startoff,$end);

if( ($i = $first+$rcount)>$end || $first<0)
die ("count overflow");
else
{
$j = $first-$rcount;
echo "Prev:::";
$j = $first+$rcount;
echo "Next
";
}

while( $first < $i)
{
echo ReadRecord($startoff,$first,$startip,$endip);
$startip = long2ip($startip);
$endip = long2ip($endip);
echo " :--
";
$first ++;
}
fclose($fp);
}
else
{
echo "Powered by upsdn.net";
echo "
Thanks to cz88.net";
}

function Whois(&$country)
{
global $ip,$fp;

$startoff = $begin = $end = 0;
GetSection($startoff,$end);
//seek index
while ($begin < $end - 1) {
$num = ($begin + $end) >> 1;
fseek ($fp , $startoff + $num * 7 , SEEK_SET ) ;
$record = unpack("Vip", fread($fp, 4));
$record['ip'] = sprintf("%u",$record['ip']);
if ($ip == $record['ip']) { $begin = $num; break;}
if ($ip > $record['ip']) $begin = $num;
else $end = $num;
}
//read index
$startip = $endip = 0;
$country = ReadRecord($startoff,$begin,$startip,$endip);
fclose($fp);
return $begin;
}

function GetSection(&$startoff,&$total)
{
global $fp;
//open ip-database
if (NULL == ($fp = fopen(IPDATA, "rb"))) die("cannot open dbfile.");
//get data section offset
$offset = unpack("Vbegin/Vend", fread($fp, 8));
$total = ($offset['end'] - $offset['begin']) / 7;
$startoff = $offset['begin'];
}

function ReadRecord($startoff,$number,&$startip,&$endip)
{
global $ip;
$record = unpack("Vbeginip/Vloc", ReadBinary($startoff+$number*7) );
$startip = $record['beginip'];
$locoff =($record['loc'] & 0x00FFFFFF);
$info = unpack("Vendip/Vloc",ReadBinary($locoff)) ;
$endip = $info['endip'];
$info['endip'] = sprintf("%u",$info['endip']);
if($info['endip'] < $ip) die(" [unkown location]");
//get GEO
$countryoff = (($info['loc'] & 0x000000FF)== 1)?($info['loc'] >> 8):($locoff+4);
return ReadGEOStr($countryoff)."->".ReadGEOStr($countryoff);
}

function ReadGEOStr(&$offset)
{
$binarydata = ReadBinary($offset);
$info = unpack("Vloc",$binarydata);
if( ($info['loc'] & 0x000000FF) == 2 ) {
$GeoStr = ReadBinary($info['loc'] >> 8 );
$GeoStr = substr($GeoStr,0,strpos($GeoStr, 0));
$offset += 4;
}else {
$len = strpos($binarydata, 0);
$GeoStr = substr($binarydata,0,$len);
$offset += $len + 1;
}
return $GeoStr;
}

function ReadBinary($positionz)
{
global $fp;
fseek ( $fp , $positionz , SEEK_SET ) ;
return fread ( $fp , 32 ) ;
}

function get_time() {
$mtime=microtime();
$mtime=explode(" ",$mtime);
$mtime=$mtime[1]+$mtime[0];
return($mtime);
}
?>

純真版IP數據庫下載:http://www.cz88.net/ip/

總結

以上是生活随笔為你收集整理的利用纯真QQIP数据库做快速IP归属地查询_PHP的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。