Discuz 5 0 中讀取純真IP資料庫函式分析

2021-04-13 07:27:49 字數 4740 閱讀 8771

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...