discuz 5.0 不在使用自己的ip資料,而是使用純真ip的資料格式, 訪問純真ip資料庫稍微有點麻煩,它的儲存格式比較特殊也很有趣,具體的格式分析參考下面兩個鏈結,其他語言實現參考文章末的鏈結。
《純真ip資料庫格式詳解》
鏈結一:http://blog.csdn.net/heiyeshuwu/archive/2006/05/12/725675.aspx
鏈結二:http://lumaqq.linuxsir.org/article/qqwry_format_detail.html
純真ip資料庫官網:http://www.cz88.net/ip/
以下函式conrvertip()位於 discuz!5_gbk/upload/include/misc.func.php 路徑中,有興趣可以具體去閱讀分析。(下面**我做了簡單的修改,更便於閱讀,核心沒有修改)
<?
//function
convertip(
$ip) .d.d.d$/",
$ip))
//開啟ip資料檔案if(
!$fd=@
fopen
($dat_path,'
rb'))//
分解ip進行運算,得出整形數
$ip=
explode('
.',$ip
);$ipnum
=$ip[0
] *16777216
+$ip[1
] *65536
+$ip[2
] *256+
$ip[3];
//獲取ip資料索引開始和結束位置
$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;//
使用二分查詢法從索引記錄中搜尋匹配的ip記錄
while
($ip1num
>
$ipnum
||$ip2num
<
$ipnum
) //
提取出來的資料轉換成長整形,如果資料是負數則加上2的32次冪
$ip1num
=implode(''
,unpack('
l',$ipdata1
));if
($ip1num
<0)
$ip1num
+=pow(2
,32);//if(
$ip1num
>
$ipnum
) //
$dataseek
=fread
($fd,3
);if
(strlen
($dataseek
) <3)
$dataseek
=implode(''
,unpack('
l',$dataseek
.chr(0
)));
fseek
($fd
,$dataseek
);$ipdata2
=fread
($fd,4
);if
(strlen
($ipdata2
) <4)
$ip2num
=implode(''
,unpack('
l',$ipdata2
));if
($ip2num
<0)
$ip2num
+=pow(2
,32);//
沒找到提示未知if(
$ip2num
<
$ipnum
) $beginnum
=$middle;}
}//下面的**讀暈了,沒讀明白,有興趣的慢慢讀
$ipflag
=fread
($fd,1
);if
($ipflag
==chr(1
)) $ipseek
=implode(''
,unpack('
l',$ipseek
.chr(0
)));
fseek
($fd
,$ipseek
);$ipflag
=fread
($fd,1
);}if(
$ipflag
==chr(2
)) $ipflag
=fread
($fd,1
);if
($ipflag
==chr(2
)) $addrseek2
=implode(''
,unpack('
l',$addrseek2
.chr(0
)));
fseek
($fd
,$addrseek2
);}
else
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
$addrseek2
=implode(''
,unpack('
l',$addrseek2
.chr(0
)));
fseek
($fd
,$addrseek2
);}
else
while
(($char
=fread
($fd,1
)) !=
chr(0))
}fclose
($fd
);//
最後做相應的替換操作後返回結果if(
//// 呼叫舉例(速度很快)
////********************====
echo
convertip(
'219.238.235.10');
//輸出: 北京市 電信通
echo
convertip(
'23.56.82.12');
//輸出:iana
echo
convertip(
'250.69.52.0');
//echo
convertip(
'238.69.52.0');
//echo
convertip(
'192.168.0.1');
//輸出:區域網 對方和您在同一內部網
echo
convertip(
'255.255.255.255');
//輸出:純真網路 2023年11月20日ip資料
?>
附:(相應其他實現程式)
利用 qqwry.dat 實現 ip 位址高效檢索(php)
)純真ip資料庫(qqwry.dat)查詢 c原始碼
Discuz 5 0 中讀取純真IP資料函式分析
discuz 5.0 中讀取純真ip資料庫函式分析 discuz 5.0 不在使用自己的ip資料,而是使用純真ip的資料格式,訪問純真ip資料庫稍微有點麻煩,它的儲存格式比較特殊也很有趣,具體的格式分析參考下面兩個鏈結,其他語言實現參考文章末的鏈結。純真ip資料庫格式詳解 鏈結一 http blog...
PHP利用純真IP資料庫在本地實現IP位址資訊查詢
準備工作 正面這個ip位址查詢處理的類 ip 地理位置查詢類 class helper iplocation 析構函式,用於在頁面執行結束後自動關閉開啟的檔案。public function destruct this fp 0 返回讀取的長整型數 access private return int...
PHP利用純真IP資料庫在本地實現IP位址資訊查詢
準備工作 正面這個ip位址查詢處理的類 ip 地理位置查詢類 class helper iplocation 析構函式,用於在頁面執行結束後自動關閉開啟的檔案。public function destruct this fp 0 返回讀取的長整型數 access private return int...