php-ip-address 库因废弃、未注册 packagist 且无 composer.json 而无法通过 composer 正常安装;推荐改用持续维护的 netmask 或 ip-lib,或手写 10 行 cidr 解析函数。

Composer 安装 php-ip-address 库失败的常见原因
直接运行 composer require php-ip-address/php-ip-address 会报错,因为该库已废弃且未在 Packagist 注册——它不是标准 Composer 包,没有 composer.json 元数据,也没有维护者提交到官方仓库。
你看到的 GitHub 项目(如 php-ip-address/php-ip-address)只是源码托管,不等于可安装包。强行用 repositories 手动添加 Git 地址虽能绕过,但会失去版本约束、自动更新和依赖解析能力,后续升级或合入其他包时极易冲突。
- 别 clone 后手动复制到
vendor/:破坏 Composer 的 autoload 机制,class not found是必然结果 - 别改
composer.json加type: package+dist:源码无稳定 tag,dev-master不受语义化版本保护,某天 push 破坏性变更就崩 - GitHub 上 star 数高 ≠ 可用:该项目最后一次 commit 在 2016 年,PHP 7.4+ 的 strict type 和返回类型声明兼容性未验证
用 netmask 或 ip-lib 替代更可靠
真正被广泛采用、持续维护、支持 CIDR 与子网掩码双向转换的替代方案是 netmask(轻量)或 ip-lib(功能全)。它们都通过 Packagist 发布,支持 PHP 8.x,autoload 开箱即用。
推荐优先试 netmask:仅一个类,无依赖,处理 IPv4 CIDR 足够快,比如判断 192.168.1.5/24 是否在 192.168.0.0/16 内:
use Net\Netmask;
<p>$block = new Netmask('192.168.1.5/24');
var_dump($block->base); // string(11) "192.168.1.0"
var_dump($block->bits); // int(24)
var_dump($block->netmask); // string(11) "255.255.255.0"</p><p>// 判断 IP 是否属于该网段
var_dump($block->match('192.168.1.100')); // bool(true)
</p>
- 安装命令:
composer require nettools/netmask - 注意命名空间是
Net\Netmask,非Netmask,漏写Net\会Class not found - 只支持 IPv4;若需 IPv6,请切到
ip-lib/ip-lib(安装:composer require ip-lib/ip-lib)
手写 CIDR 解析函数其实只要 10 行
如果你只需要基础功能(如把 10.0.0.0/8 拆成 network + netmask),不依赖外部库更可控,也避免 Composer 锁文件膨胀。
核心逻辑就三步:分离地址与前缀、按位计算掩码、与 IP 做 & 运算得网络地址。IPv4 下可安全用整型运算:
function cidrToNetwork(string $cidr): array
{
[$ip, $prefix] = explode('/', $cidr);
$prefix = (int)$prefix;
$mask = -1 long2ip($network),
'netmask' => long2ip($mask),
'prefix' => $prefix,
];
}
// cidrToNetwork('172.16.0.0/12') → ['network'=>'172.16.0.0', 'netmask'=>'255.240.0.0', ...]
- 必须校验
$prefix范围:IPv4 是 0–32,超出会触发long2ip()返回 false -
ip2long()对非法 IP(如999.999.999.999)返回 false,需提前filter_var($ip, FILTER_VALIDATE_IP) - 此函数不处理 IPv6;IPv6 需用
inet_pton()+unpack(),复杂度陡增,此时不如用ip-lib
为什么不要硬塞 php-ip-address 到 vendor
即使你通过 git clone 把代码放进去,并用 classmap 强制加载,也会立刻暴露两个硬伤:
- 源码中大量使用
create_function()(PHP 7.2+ 已移除),运行时直接Fatal error: Uncaught Error: Call to undefined function create_function() - 无命名空间,所有类为全局名(如
IP_Address),与现代框架的自动加载规则冲突,PSR-4 扫描不到,use语句无效 - 测试用例里混用
$_SERVER['REMOTE_ADDR']做示例,实际部署时可能误读 CGI 环境变量,导致 CIDR 判断逻辑错乱
这些不是配置问题,是代码层已无法适配当前 PHP 生态。换库或手写,比打补丁更省时间。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











