phpenv不支持直接安装php-radius扩展,需手动编译:先装libradius开发库,再用phpize+configure+make安装,最后在对应PHP版本的php.ini中添加extension=radius并验证。

phpenv 本身不直接提供 php-radius 扩展的安装命令,这个扩展必须手动编译安装——因为它是 PECL 中非主流、非默认启用的扩展,且依赖系统级 C 库(libradius),不能靠 pecl install radius 一键搞定。
确认系统已安装 libradius 开发库
php-radius 是 PHP 对 RADIUS 协议的封装,底层调用系统 libradius。没它,编译会直接失败,报错类似:
configure: error: Cannot find libradius headers
不同系统安装方式不同:
- Ubuntu/Debian:
sudo apt-get install -y libradius1-dev - CentOS/RHEL/Fedora:
sudo dnf install -y radiusclient-ng-devel(注意:部分旧版用freeradius-client-devel) - macOS(Homebrew):
brew install freeradius-client
装完后验证头文件是否存在:ls /usr/include/radius.h 或 find /usr -name "radius.h" 2>/dev/null。找不到就别往下走。
立即学习“PHP免费学习笔记(深入)”;
用 pecl + phpize 编译安装 radius 扩展
pecl install radius 在多数 phpenv 环境中会失败,原因有三:缺少 libradius 路径、PHP 源码未保留(php-build 默认不存)、或 phpize 指向错误版本。
推荐手动流程(以当前激活的 PHP 版本为准):
- 先确认当前 PHP 版本:
phpenv version(例如输出8.2.18 (set by /path/to/project/.php-version)) - 进入该版本源码目录(若用
php-build安装):cd $(phpenv root)/versions/8.2.18/src;如果没保留源码,需重新用phpenv install --keep安装一次带源码的版本 - 运行:
phpize(确保是目标版本的phpize,可用which phpize核对) - 下载并解压 PECL radius:
pecl download radius→ 解压后进入目录 - 配置时显式指定
libradius路径:./configure --with-radius=/usr(路径按你系统实际位置调整,如/usr/local) make && sudo make install
成功后会输出类似:Installing '/home/xxx/.phpenv/versions/8.2.18/lib/php/extensions/no-debug-zts-20220829/radius.so'
启用扩展并验证
编译完只是把.so 文件放进了扩展目录,还没启用。
编辑当前 PHP 版本的 php.ini(路径通常为:$(phpenv root)/versions/8.2.18/etc/php.ini):
- 加一行:
extension=radius(不是extension=radius.so,PHP 8.0+ 支持无后缀写法) - 确保
extension_dir指向正确目录(可查php -i | grep extension_dir)
验证是否加载成功:
-
php -m | grep radius→ 应输出radius -
php -r "var_dump(function_exists('radius_auth_open'));"→ 应返回bool(true)
如果报 undefined function,说明扩展没加载,重点检查 php.ini 是否被真正读取(php --ini 看加载路径)、以及是否在正确的 PHP 版本目录下改了配置。
切换 PHP 版本后 radius 扩展失效?
这是最常被忽略的一点:phpenv 的每个 PHP 版本都有独立的 php.ini 和扩展目录。你在 8.2.18 装好并启用后,切到 8.1.27 就完全没这个扩展。
解决方法只有两个:
- 对每个需要
radius的 PHP 版本,重复上面「编译 + 启用」流程 - 或者统一用一个长期维护的版本(比如 8.2.x)做认证服务开发,避免多版本来回折腾
不要试图共享 .so 文件——不同 PHP 主版本(如 8.1 vs 8.2)的 ABI 不兼容,强行复制会导致 Segmentation fault。



















