寻找Linux /usr/bin/xz的Windows替代工具(支持LZMA1参数配置)
替代Linux xz工具的Windows方案(支持LZMA1配置)
方案1:使用7-Zip命令行工具(7z.exe)
7-Zip的命令行版本完全支持LZMA1压缩,可配置对应的lc/lp/pb/dict参数,适配Windows环境。
操作步骤:
- 下载Windows版7-Zip,安装后找到
7z.exe(默认路径如C:\Program Files\7-Zip\7z.exe) - 替换原
proc_open调用的命令,参数对应关系如下:- Linux xz的
--format=raw对应7z的-txz+-mm=LZMA1 --lzma1=lc=3,lp=0,pb=2,dict=128KiB对应7z的-md=128k -mlc=3 -mlp=0 -mpb=2-c -(从stdin读、stdout写)对应7z的-si(读自标准输入)+-so(写到标准输出)+a -(输出到stdout)
- Linux xz的
替换后的PHP代码:
$x = proc_open( '"C:\Program Files\7-Zip\7z.exe" a -txz -mm=LZMA1 -md=128k -mlc=3 -mlp=0 -mpb=2 -si -so -', [0 => ["pipe", "r"], 1 => ["pipe", "w"]], $p );
方案2:使用PHP LZMA扩展(liblzma)
若可安装PHP扩展,直接用官方liblzma扩展(PHP 7.3+支持),无需外部工具,性能更优。
操作步骤:
- 下载对应PHP 8.1 x64 Windows版本的
php_lzma.dll,放入PHP的ext目录,修改php.ini添加extension=lzma - 用
lzma_encode函数实现对应配置:
// 匹配原参数:lc=3, lp=0, pb=2, dict=128KiB $options = [ 'mode' => LZMA_MODE_COMPRESS, 'dict_size' => 128 * 1024, 'lc' => 3, 'lp' => 0, 'pb' => 2, 'flags' => LZMA_FMT_RAW // 对应--format=raw ]; // 模拟原代码的管道输入输出逻辑 $input = stream_get_contents(STDIN); $compressed = lzma_encode($input, $options); echo $compressed;
若需保留proc_open管道模式,可将上述逻辑封装为单独PHP脚本后调用,但直接用扩展效率更高。
方案3:纯PHP实现的LZMA库
若无法安装扩展,可选用纯PHP的LZMA实现(无需外部依赖),适合小数据量场景。
操作示例:
// 假设已引入纯PHP的LZMA压缩类 $lzma = new LZMACompressor(); // 配置对应参数 $lzma->setDictionarySize(128 * 1024); $lzma->setLiteralContextBits(3); $lzma->setLiteralPositionBits(0); $lzma->setPositionBits(2); // 处理输入输出 $input = stream_get_contents(STDIN); $compressed = $lzma->compress($input, true); // true表示raw格式输出 echo $compressed;
内容的提问来源于stack exchange,提问作者theoneiam
相关产品推荐
相关产品推荐

