【问题标题】:How can I extract a compressed archive in Perl?如何在 Perl 中提取压缩档案?
【发布时间】:2010-12-12 17:25:47
【问题描述】:

我需要允许用户通过网络表单上传 zip 文件。该服务器使用 Apache Web 服务器运行 Linux。使用Archive::Zip 之类的模块来提取此存档是否有优势,或者我应该使用反引号对unzip 执行系统调用?

【问题讨论】:

    标签: perl archive unzip


    【解决方案1】:

    根据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,那么它也适用于其他压缩格式。
    【解决方案2】:

    如果你执行二进制文件unzip,你的进程会fork/exec和

    1. 实例化一个新进程
    2. 消耗更多内存(在生成的进程期间)

    您还必须配置到unzip 的正确路径。鉴于这一切,我更喜欢图书馆的方法。

    【讨论】:

    • 我从来不理解这种想法。 fork/exec 是一个非常快的过程,任何花时间阅读或编写 shell 脚本的人都知道这一点。与算法成本和(尤其是)其中的数据相比,解压缩二进制文件本身消耗的内存是微不足道的。每个 Linux 发行版都默认提供 /usr/bin/unzip,我相信 BSD 和 Cygwin 也是如此。除非你有像open my $input, "unzip -cp $ARCHIVE $FILE |" 这样简单的示例代码,否则我更喜欢简单的选项。
    • 虽然我一般同意上述观点,但如果您的服务器负载很重,那么您的资源消耗会随着 fork/exec 模型的增加而增加。 pid 分配、进程间流分配、内存分配(允许写时复制)。对于独立进程,我对 fork/exec 模型感到满意。对于服务器模型,我更倾向于避免使用资源分配最少的模型。
    • 如果你在一个循环中分叉,尤其是一个热循环,你绝对会看到性能问题。如果您不在循环中,或者您以每秒一次或每隔几秒一次的速度分叉,那么没问题。此外,使用库而不是系统 unzip 命令可能是一个好处;该库可能更新且错误更少。
    【解决方案3】:

    一个问题是内存。我们发现Archive::Tar 存在内存泄漏的困难方式(生产网络服务器崩溃)。因此,虽然总体上使用模块而不是对外部命令的系统调用是一个好主意(请参阅其他回复以了解推理),但您需要确保该模块没有陷阱。

    【讨论】:

      猜你喜欢
      • 2012-12-09
      • 1970-01-01
      • 2011-06-14
      • 2017-09-28
      • 1970-01-01
      • 1970-01-01
      • 2014-06-20
      • 1970-01-01
      • 2014-10-08
      相关资源
      最近更新 更多