【发布时间】:2010-12-12 17:25:47
【问题描述】:
我需要允许用户通过网络表单上传 zip 文件。该服务器使用 Apache Web 服务器运行 Linux。使用Archive::Zip 之类的模块来提取此存档是否有优势,或者我应该使用反引号对unzip 执行系统调用?
【问题讨论】:
我需要允许用户通过网络表单上传 zip 文件。该服务器使用 Apache Web 服务器运行 Linux。使用Archive::Zip 之类的模块来提取此存档是否有优势,或者我应该使用反引号对unzip 执行系统调用?
【问题讨论】:
根据Archive::Zip documentation,您最好使用Archive::Extract:
如果您只是要提取 zip(和/或其他存档),建议您使用 Archive::Extract 代替,因为它更易于使用并且排除了存档特定的功能。
这很有趣,因为 Archive::Extract will try Archive::Zip first and then fall back to the unzip binary if it fails. 所以看来 Archive::Zip 是首选选项。
Archive::Zip 使用Compress::Raw::Zlib,它是zlib 系统库的低级接口;所以它不是一个纯粹的 Perl 实现,这意味着它在性能上与unzip 相似。因此,换句话说,从性能的角度来看,没有理由在 Archive::Zip 之前选择 unzip。
【讨论】:
Archive::Extract,那么它也适用于其他压缩格式。
如果你执行二进制文件unzip,你的进程会fork/exec和
您还必须配置到unzip 的正确路径。鉴于这一切,我更喜欢图书馆的方法。
【讨论】:
open my $input, "unzip -cp $ARCHIVE $FILE |" 这样简单的示例代码,否则我更喜欢简单的选项。
unzip 命令可能是一个好处;该库可能更新且错误更少。
一个问题是内存。我们发现Archive::Tar 存在内存泄漏的困难方式(生产网络服务器崩溃)。因此,虽然总体上使用模块而不是对外部命令的系统调用是一个好主意(请参阅其他回复以了解推理),但您需要确保该模块没有陷阱。
【讨论】: