Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 存储单个IP、IP范围、IP块和IP类并快速搜索它们的最佳方法_Php_Mysql_Sql_Database_Ip - Fatal编程技术网

Php 存储单个IP、IP范围、IP块和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块 每次有人访问我的网站时,都会访问这个数据库(所以需

在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块

每次有人访问我的网站时,都会访问这个数据库(所以需要快速)。 有什么想法吗?

本教程有助于:

保存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规则],或者可以设置一个其他字段:

  • ip_end
    是范围[192.168.1.10至192.168.1.15]规范的结束部分
  • ip_子网
    是子网掩码[192.168.1.0/22]
  • ip_class
    是网络类,尽管它们在逻辑上只能存储为/8、/16或/24子网
完全忽略ip_类

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是的。我想一旦发生了苹果酒,人们都会说“哦,天哪,那些‘一流’的废话有多蠢?”