PHP-Rar是需编译安装的原生扩展,非Composer包,故composer require会失败;正确方式是系统级安装(如apt install php-rar或pecl install rar)并启用rar.so,再通过RarArchive类操作RAR文件。

PHP-Rar 扩展不是 Composer 包,不能用 composer require 安装
PHP-Rar 是一个 PHP 扩展(extension),不是纯 PHP 的 Composer 包。它底层依赖 librar,必须编译进 PHP 解释器,因此 composer require 会失败,报错类似 Package php-rar/php-rar not found 或 Could not find package php-rar/php-rar。你看到的某些 GitHub 上标着 “php-rar” 的 Composer 包,基本是封装了系统命令(如 unrar)的 wrapper,功能和稳定性远不如原生扩展。
正确安装方式:编译或启用 PHP-Rar 扩展
前提是你的 PHP 环境允许加载扩展(非 shared hosting,有 root 或管理员权限)。步骤取决于系统:
- Linux(Ubuntu/Debian):
sudo apt install php-rar(如果源里有对应 PHP 版本的包),然后确认rar.so已写入php.ini并重启 PHP-FPM 或 Apache - Linux(CentOS/RHEL):需手动编译,先装
librar-devel和php-devel,再从 PECL 下载源码,phpize && ./configure && make && sudo make install,最后在php.ini加extension=rar - macOS(Homebrew):用
pecl install rar,确保已装php-dev和librar - Windows:下载对应 PHP 版本和线程安全(TS/NTS)的
php_rar.dll,放进ext/目录,php.ini中加extension=php_rar.dll
装完后运行 php -m | grep rar 或 phpinfo() 查看是否启用成功。
读取 RAR 文件的典型代码与常见坑
扩展启用后,用 RarArchive::open() 打开,再用 getEntries() 遍历,extract() 提取。注意以下几点:
立即学习“PHP免费学习笔记(深入)”;
-
RarArchive::open()返回false时,不代表文件不存在,可能是密码保护、损坏或不支持的 RAR5 格式(PHP-Rar 仅支持 RAR3,不支持 RAR5) - 提取单个文件要用
$entry->extract(false, $targetPath);第二个参数设为false表示不解压到当前目录,而是按$targetPath路径写入 - 若 RAR 有密码,必须调用
$archive->setPassword('xxx')在open()之后、getEntries()之前 - 中文文件名可能乱码,因 RAR 存储编码不统一,PHP-Rar 默认按 CP850 或 ISO-8859-1 解析,可尝试用
mb_convert_encoding($entry->getName(), 'UTF-8', 'CP850')转换
简单示例:
$archive = RarArchive::open('sample.rar');
if ($archive === false) {
die("无法打开 RAR 文件");
}
$entries = $archive->getEntries();
foreach ($entries as $e) {
$e->extract(false, './output/' . $e->getName());
}
$archive->close();
没有权限装扩展?用 unrar 命令行替代
如果你只能用 Composer,且服务器已装 unrar(Linux/macOS)或 UnRAR.exe(Windows),可用 symfony/process 调用外部命令:
- 先
composer require symfony/process - 执行
unrar x -o+ archive.rar ./output/(-o+覆盖同名文件) - 注意:路径要绝对化,
escapeshellarg()处理用户输入,否则有命令注入风险 - 错误判断靠
$process->getErrorOutput()和退出码,unrar密码错误时退出码是 2,损坏是 3
这种方案绕开了扩展限制,但丧失了对单个条目操作的能力(比如只解压某几个文件),也依赖外部环境一致性。
真正想用 RarArchive 类,就得装扩展——这点没法绕。很多人卡在第一步就放弃,其实是没分清“库”和“扩展”的本质区别。



















