Php 存储单个IP、IP范围、IP块和IP类并快速搜索它们的最佳方法
在MySQL数据库中存储多种IP类型的最佳方法是什么:Php 存储单个IP、IP范围、IP块和IP类并快速搜索它们的最佳方法,php,mysql,sql,database,ip,Php,Mysql,Sql,Database,Ip,在MySQL数据库中存储多种IP类型的最佳方法是什么: -单一IP(123.123.123.123) -IP范围(123.123.123.1-123.123.123.121) -IP块(123.123.123.1/20) -IP等级(123.123.123.*或123.123.) 我曾考虑将所有范围/块/类转换为单个IP,并使用ip2long存储它们,以便更快地搜索到表中,但这将导致100多万个数据库,我还需要不时减少/扩大类或更改/删除IP块 每次有人访问我的网站时,都会访问这个数据库(所以需
-单一IP(123.123.123.123)
-IP范围(123.123.123.1-123.123.123.121)
-IP块(123.123.123.1/20)
-IP等级(123.123.123.*或123.123.) 我曾考虑将所有范围/块/类转换为单个IP,并使用ip2long存储它们,以便更快地搜索到表中,但这将导致100多万个数据库,我还需要不时减少/扩大类或更改/删除IP块 每次有人访问我的网站时,都会访问这个数据库(所以需要快速)。 有什么想法吗?本教程有助于: 保存IPv4地址最有效的方法是使用INT字段(而不是您可能期望的VARCHAR)。您可以使用PHP的ip2long和MySQL的INET_NTOA函数或PHP的longtoip来转换它们
来源:您可以将所有类型的地址存储为线字符串(点(-1,
第一个ip\u iplong
)、点(+1,最后一个ip\u iplong
)、向该字段添加索引,并使用几乎任何数据或记录计数享受即时搜索(使用MBR交叉)
可以找到更多信息
请注意,这种做法将使您的代码在mysql中紧密耦合。类似于:
CREATE TABLE ip_ranges (
id INT UNSIGNED AUTO_INCREMENT,
ip_start INT UNSIGNED NOT NULL,
ip_end INT UNSIGNED DEFAULT NULL,
ip_subnet TINYINT UNSIGNED DEFAULT NULL,
ip_class ENUM('A', 'B', 'C') DEFAULT NULL
)
其中,ip_start
是必需的,并且所有其他字段可以为空[单个ip规则],或者可以设置一个其他字段:
是范围[192.168.1.10至192.168.1.15]规范的结束部分ip_end
是子网掩码[192.168.1.0/22]ip_子网
是网络类,尽管它们在逻辑上只能存储为/8、/16或/24子网ip_class
SELECT *
FROM ip_ranges
WHERE
$ipaddr BETWEEN ip_start AND ip_end
OR
$ipaddr BETWEEN
(ip_start &~ (POW(2,32-ip_subnet)-1)) AND
(ip_start | (POW(2,32-ip_subnet)-1))
应选择适用于
$ipaddr
的任何规则。[但我还没有测试过]只要你知道ip!=人,任何ip阻塞都可以避免。您在这里描述的三种类型-范围、块和类都是描述同一事物的不同方式。@Dagon我知道这一点,我不想使用此列表来阻止某些人。@Dagswuff是的,你是对的,所有这些都可以很快在IP范围内转换,但我收到这种类型的IP,因此当有人向我发送修改时,将信息从IP范围反转到IP块会有点困难,然后修改/删除它并添加新信息。IP地址不是空间坐标。使用GIS类型对它们进行索引是一个糟糕的想法。你知道有其他方法可以在IP范围内进行即时搜索吗?+1 IP地址绝对是空间坐标(IP“地址空间”lol)。。。包含它们的框(子网)的大小始终是2的幂,在框的“角”处找到包含IP地址的边界框是R-树的一个绝妙用法,远远优于使用B-树所能完成的任何操作。。。你会得到一个带有MySQL空间索引的R树。不,这仍然是个糟糕的主意。IP地址是线性的,而不是空间的。例如,地址12.34.56.78与99.34.56.78没有关系。好吧,好吧,点在一个行字符串上,这仍然是“空间的”。当你查找一个IP地址时,你通常会查看一组地址范围(低/高对,子网)。R-树是一种非常快速的找到它们的方法。如果您对子网或范围不感兴趣,那么这种方法当然是毫无意义的。。。但是在你尝试之前不要敲ot。谢谢你的回答。但是我已经指定了将以数字形式转换IP(使用ip2long php函数)。我所需要的只是一个想法,将Ip类/块/和单个Ip放在一起,并快速搜索/修改/删除它们。网络“类”的概念已经过时20多年了——定义CIDR的RFC 1518和1519于1993年发布。请忘记网络的“阶级”曾经存在。@Daskwuff是的。我想一旦发生了苹果酒,人们都会说“哦,天哪,那些‘一流’的废话有多蠢?”