PHP如何在函数中调用配置文件IP段变量并支持CIDR格式
实现方案
1. 主配置文件(示例命名为config.php)
管理员仅需要编辑这个文件添加IP规则,无需修改业务逻辑代码,写法简单易懂:
<?php // 移动IP地址范围配置,支持「起始IP-结束IP」和「CIDR格式」两种写法,按需新增即可 $MobileIPs = []; $MobileIPs[] = "66.87.0.0-66.87.255.255"; // Sprint mobile $MobileIPs[] = "174.192.0.0-174.255.255.255"; // Verizon mobile $MobileIPs[] = "85.110.50.0/24"; // 新增规则直接按照上面的格式添加即可,不需要手动调整下标 ?>
2. 优化后的IP校验函数
兼容原有IP范围格式的同时新增CIDR格式支持,代码如下:
<?php // 引入配置文件,可根据项目实际路径调整 require_once 'config.php'; function ip_is_mobile($ip) { // 引入全局配置变量,也可根据需求改为将配置作为参数传入函数 global $MobileIPs; $longIp = ip2long($ip); // 输入为无效IP直接返回false if ($longIp === false || $longIp == -1) { return false; } foreach ($MobileIPs as $range) { $range = trim($range); if (empty($range)) { continue; } // 处理横杠分隔的IP范围 if (strpos($range, '-') !== false) { list($startIp, $endIp) = explode('-', $range, 2); $startLong = ip2long(trim($startIp)); $endLong = ip2long(trim($endIp)); if ($startLong && $endLong && $longIp >= $startLong && $longIp <= $endLong) { return true; } } // 处理CIDR格式IP段 elseif (strpos($range, '/') !== false) { list($subnet, $mask) = explode('/', $range, 2); $subnetLong = ip2long(trim($subnet)); $mask = intval(trim($mask)); if ($subnetLong && $mask >= 0 && $mask <= 32) { $maskLong = ~((1 << (32 - $mask)) - 1); $startLong = $subnetLong & $maskLong; $endLong = $startLong + pow(2, 32 - $mask) - 1; if ($longIp >= $startLong && $longIp <= $endLong) { return true; } } } } return false; } ?>
使用说明
- 管理员添加规则无需懂代码,直接在配置文件里新增对应格式的IP段即可,两种格式可以自由混用,最多20条的量级下完全不会有性能问题
- 函数内置格式容错,填写错误的配置条目会自动跳过,不会影响正常功能
- 代码兼容PHP5.6及以上所有常用版本,无需额外扩展支持
内容的提问来源于stack exchange,提问作者Jeff
相关产品推荐
相关产品推荐

