- 贴心猫(Imcat)
- 贴心代码
- 详情
ip2long()和long2ip()-你不了解PHP的10件事情
发布:2013-02-07 11:17
点击612次
评论:0条
http://www.php100.com/html/itnews/it/2012/1114/11556.html
你不了解PHP的10件事情
1.使用 ip2long() 和 long2ip() 函数来把 IP 地址转化成整型存储到数据库里。这种方法把存储空间降到了接近四分之一(char(15) 的 15 个字节对整形的 4 个字节),计算一个特定的地址是不是在一个区段内页更简单了,而且加快了搜索和排序的速度(虽然有时仅仅是快了一点)。
2.在验证 email 地址的时候使用 checkdnsrr() 函数验证域名是否存在。这个内置函数能够确认指定的域名能够解析成 IP 地址。该函数的PHP 文档的用户评论部分有一个简单的用户自定义函数,这个函数基于 checkdnsrr(),用来验证 email 地址的合法性。对于那些认为自己的 email 地址是 “joeuser@wwwphp.net” 而不是 “joeuser@php.net” 的家伙们,这个方法可以很方便的抓住他们。
3.如果你使用的是 PHP 5 和 MySQL 4.1 或者更高的版本,考虑抛弃 mysql_* 系列函数改用改进版的 mysqli_* 系列函数。一个很好的功能就是你可以使用预处理语句,如果你在维护一个数据库密集型站点,这个功能能够加快查询速度。一些评估分数。
http://www.php100.com/html/webkaifa/PHP/PHPyingyong/2009/0927/3349.html
PHP的ip2long有bug,请慎用
先看看下边这段PHP代码。这段使用ip2long函数,对同一个IP进行转换。当然,也有人认为58.99.011.1和058.99.011.1算不上合法的
IP,那就Return,此文对你没有帮助。
为什么要使用带前导零的ip:为了在数据库中查询,这个可以在IP库中定位到ip所对应的位置信息。虽然没有整型的IP查询效率高,但毕竟直观啊。
view plaincopy to clipboardprint?
<?php
echo ip2long(''58.99.11.1''),"<br/>"; //输出是 979569409
echo ip2long(''58.99.011.1''),"<br/>"; //输出是 979568897
echo ip2long(''058.99.11.1''),"<br/>"; //输出是空
?>
<?php
echo ip2long(''58.99.11.1''),"<br/>"; //输出是 979569409
echo ip2long(''58.99.011.1''),"<br/>"; //输出是 979568897
echo ip2long(''058.99.11.1''),"<br/>"; //输出是空
?>
在PHP 4.x,5.x中, 有前导零的ip转换的结果都不正确。
解决办法,使用写自己的函数:
view plaincopy to clipboardprint?
function myip2long($ip){
$ip_arr = split(''\.'',$ip);
$iplong = (16777216 * intval($ip_arr[0])) + (65536 * intval($ip_arr[1])) + (256 * intval($ip_arr[2])) + intval($ip_arr[3]);
return $iplong;
}
http://logo32.blog.163.com/blog/static/6681169020111129104051297/
shell中自定义ip2long函数
关于ip地址的转换,看到CU上一个帖子,自己定义了ip2long和long2ip两个函数,如下:
#!/bin/bash
function IP2long(){
local IFS=''.''
read IP1 IP2 IP3 IP4 <<<"$1"
echo $((IP1*(1<<24)+IP2*(1<<16)+IP3*(1<<8)+IP4))
}
function long2IP(){
local IP=$1
local NET=
NET=".$(( IP - (IP >> 8 << 8 ) ))${NET}"
(( IP >>= 8 ))
NET=".$(( IP - (IP >> 8 << 8 ) ))${NET}"
(( IP >>= 8 ))
NET=".$(( IP - (IP >> 8 << 8 ) ))${NET}"
(( IP >>= 8 ))
NET="${IP}${NET}"
echo $NET
}
ip=${1%/*}
mask=${1#*/}
ip=$(IP2long $ip)
mask=$((((1<<32)-1)<<(32-mask)))
net=$(long2IP $((ip&mask)))
echo $net
用法:
./ip.sh 192.168.5.220/24
根据一个IP/MASK的形式,来计算实际的网络地址
方法是用 mask个1与32-mask个0与IP相与,得到一个新的IP地址,那个地址就是网络地址
想法就是把IP转换成长整数,然后与mask相与后,再转换成点分的表示法