PHP基于ip2long實(shí)現(xiàn)IP轉(zhuǎn)換整形
如何將四個(gè)字段以點(diǎn)分開(kāi)的IP網(wǎng)絡(luò)址協(xié)議地址轉(zhuǎn)換成整數(shù)呢?PHP里有這么一個(gè)函數(shù)ip2long.比如
<?php
echo ip2long("10.2.1.3");
?>
我們將得到
167903491
這是如何計(jì)算的,目前我知道有兩個(gè)算法。其一
<?php function ip2int($ip){ //我們先把ip分為四段,$ip1,$ip2,$ip3,$ip4 list($ip1,$ip2,$ip3,$ip4)=explode(".",$ip); //然后第一段乘以256的三次方,第二段乘以256的平方,第三段乘以256 //這即是我們得到的值 return $ip1*pow(256,3)+$ip2*pow(256,2)+$ip3*256+$ip4; } ?>
其二,用位運(yùn)算
<?php function ip2int($ip){ list($ip1,$ip2,$ip3,$ip4)=explode(".",$ip); return ($ip1<<24)|($ip2<<16)|($ip3<<8)|($ip4); } ?>
我們會(huì)發(fā)現(xiàn),有些ip轉(zhuǎn)化成整數(shù)后,是負(fù)的,這是因?yàn)榈玫降慕Y(jié)果是有符號(hào)整型,最大值是2147483647.要把它轉(zhuǎn)化為無(wú)符號(hào)的,可以用
sprintf("%u",ip2long($ip);
就能轉(zhuǎn)換為正整數(shù)。而且得到的結(jié)果用long2ip也可以正常轉(zhuǎn)換回原來(lái)的ip地址。也可以用ip2long來(lái)驗(yàn)證一個(gè)ip是否是有效的,如
<?php function chk_ip($ip){ if(ip2long($ip)=="-1") { return false; } return true; } //應(yīng)用 var_export(chk_ip("10.111.149.42")); var_export(chk_ip("10.111.256.42")); ?>
將輸出true和false
把ip數(shù)據(jù)保存在數(shù)據(jù)庫(kù)(MySQL)中時(shí)候,我們習(xí)慣用ip2long函數(shù)生成整型,然后存放在一個(gè)int(11)類型的字段中,但是,在不同的系統(tǒng)平臺(tái)上,ip2long函數(shù)得到的值是不同的,因此可能造成在從數(shù)據(jù)庫(kù)中讀出數(shù)據(jù),用long2ip得到ip的時(shí)候產(chǎn)生錯(cuò)誤,說(shuō)一下我們碰到的情況:
我們用一個(gè)int(11)類型(范圍-2147483648 - 2147483647)來(lái)保存把一個(gè)ip地址用ip2long處理得到的結(jié)果,例如ip是'202.105.77.179′,那么在32位機(jī)器上得到的結(jié)果是:-899068493,而在64位機(jī)器上卻得到3395898803.然后把它寫入數(shù)據(jù)庫(kù),由于超過(guò)int(11)的范圍,因此64位機(jī)器上的結(jié)果被保存為int(11)的最大值:2147483647.于是在從數(shù)據(jù)庫(kù)中取出的時(shí)候,便得到了錯(cuò)誤的結(jié)果,會(huì)得到”127.255.255.255″這個(gè)ip地址.
解決的辦法很多,比如可以用mysql的函數(shù):INET_ATON和INET_NTOA來(lái)處理ip地址;或者把保存ip地址的字段改為bigint類型,這樣在64位機(jī)器上雖然保存的是3395898803,使用long2ip函數(shù)仍能得到正確的結(jié)果.
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
php開(kāi)發(fā)最強(qiáng)大的IDE編輯的phpstorm 2020.2配置Xdebug調(diào)試的詳細(xì)教程
這篇文章主要介紹了php開(kāi)發(fā)最強(qiáng)大的IDE編輯的phpstorm 2020.2配置Xdebug調(diào)試,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08基于Laravel 多個(gè)中間件的執(zhí)行順序詳解
今天小編就為大家分享一篇基于Laravel 多個(gè)中間件的執(zhí)行順序詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-10-10Laravel 5框架學(xué)習(xí)之環(huán)境與配置
本文給大家主要介紹的是Laravel5框架中的環(huán)境配置,給大家詳細(xì)介紹了.env的配置文件,包含的數(shù)據(jù)庫(kù)配置信息的詳細(xì)解釋,這里推薦給大家,有需要的小伙伴參考下。2015-04-04淺談關(guān)于PHP解決圖片無(wú)損壓縮的問(wèn)題
本篇文章主要介紹了淺談關(guān)于PHP解決圖片無(wú)損壓縮的問(wèn)題,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-09-09CodeIgniter記錄錯(cuò)誤日志的方法全面總結(jié)
這篇文章主要介紹了CodeIgniter記錄錯(cuò)誤日志的方法,詳細(xì)分析了CodeIgniter框架的文件結(jié)構(gòu)與相應(yīng)的功能,結(jié)合實(shí)例分析了CodeIgniter框架記錄錯(cuò)誤日志的實(shí)現(xiàn)技巧,并分析了隱藏index文件與數(shù)據(jù)傳輸?shù)燃记?總結(jié)非常全面,需要的朋友可以參考下2016-05-05PHP XML備份Mysql數(shù)據(jù)庫(kù)
以下是在Linux下通過(guò)Apache+PHP對(duì)Mysql數(shù)據(jù)庫(kù)的備份的文件代碼2009-05-05