phpenv下安装rar扩展必须源码编译:先克隆cataphract/php-rar,执行phpize、configure(指定php-config路径)、make install,再在对应版本的php.ini中以绝对路径添加extension=,最后验证函数存在并注意locale与路径安全。

phpEnv 默认不带 Rar 扩展,必须手动编译安装;直接改 php.ini 加 extension=rar.so 会报错“undefined function rar_open”。
phpEnv 下安装 rar 扩展必须用源码编译
phpEnv 是基于源码编译的 PHP 环境管理工具,所有扩展都得自己编译,不能像宝塔那样一键安装。它不提供预编译的 rar.so,也不能用 pecl install rar(该命令在 phpEnv 环境下通常失败)。
- 先确认当前 phpEnv 使用的 PHP 版本和路径:
phpenv version和which php,再查php-config位置,比如/root/.phpenv/versions/7.4.33/bin/php-config - 去 github.com/cataphract/php-rar 克隆最新源码(PECL 上的旧版
rar扩展已不兼容 PHP 7.3+) - 进入源码目录执行:
phpize→./configure --with-php-config=/path/to/php-config→make && make install - 成功后会在
modules/目录生成rar.so,记下完整路径(如/root/.phpenv/versions/7.4.33/lib/php/extensions/no-debug-zts-20190902/rar.so)
启用 rar.so 要改对 php.ini 文件
phpEnv 每个 PHP 版本有独立的配置文件,不是全局一个 php.ini。改错位置会导致扩展加载失败,phpinfo() 里看不到 rar 模块。
- 运行
php --ini查看实际加载的配置路径,通常是:/root/.phpenv/versions/x.x.x/etc/php.ini - 在该
php.ini末尾添加完整路径的 extension 行:extension=/full/path/to/rar.so(不能只写extension=rar.so) - 重启 PHP 进程(如果是 CLI 模式,不用重启;如果是 FPM,需
phpenv fpm-stop && phpenv fpm-start) - 执行
php -m | grep rar或php -r "print_r(get_extension_funcs('rar'));"验证函数是否存在
解压 RAR 文件时注意编码和路径安全
rar_open() 对中文路径极其敏感,尤其在 Linux 下用 phpEnv 运行时,默认 locale 常为 C,导致 rar_list() 返回乱码或空数组,rar_entry_get() 找不到条目。
- 解压前强制设置 locale:
setlocale(LC_CTYPE, 'zh_CN.UTF-8')(确保系统已安装该 locale) - 不要依赖
iconv()硬转 GB2312 —— 这是 Windows 时代的坑,现在 RAR 文件基本都是 UTF-8 存档名,强行转码反而破坏路径 -
$entry->extract($targetDir)的$targetDir必须是绝对路径,且 PHP 进程有写权限;相对路径可能被解析到 phpEnv 的源码目录下 - 务必检查
$entry->getPackedSize()是否为 0,避免解压空条目或符号链接(RAR 中可能含恶意软链)
替代方案:用 unrar 命令更稳但需系统支持
如果编译 rar 扩展失败(常见于缺少 libunrar 开发头文件),可退而求其次调用系统 unrar 命令。这不是纯 PHP 方案,但在 phpEnv 下反而更可靠。
- 先装系统 unrar:
apt install unrar(Debian/Ubuntu)或yum install unrar(CentOS) - 用
exec()调用:exec("unrar x -o+ -y {$rarFile} {$targetDir} 2>&1", $output, $returnCode) - 必须加
-o+(覆盖)和-y(自动确认),否则交互式卡住;2>&1合并错误流便于捕获异常 - 注意:
$rarFile和$targetDir必须用escapeshellarg()过滤,否则路径含空格或单引号会执行失败甚至命令注入
真正麻烦的不是“怎么装”,而是 phpEnv 每次切换 PHP 版本后,rar 扩展不会自动重建 —— 你得为每个版本单独编译一次 rar.so,并且确认 php-config 路径没变。这点很容易被忽略,结果换了个版本就发现 rar_open 又报错了。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











