Как я могу извлечь сжатый архив в Perl?

Мне нужно разрешить пользователям загружать zip-файл через веб-форму. Сервер работает под управлением Linux с веб-сервером Apache. Есть ли преимущества в использовании модуля типа Archive::Zip для извлечения этого архива или я должен просто выполнить системный вызов unzip с обратными кавычками?


person cowgod    schedule 03.11.2009    source источник


Ответы (3)


Согласно Archive::Zip документации лучше использовать Архив::Извлечение:

Если вы просто собираетесь извлекать zip-файлы (и/или другие архивы), вам рекомендуется вместо этого использовать Archive::Extract, так как он намного проще в использовании и не учитывает специфические для архива функции.

Это интересно, потому что Archive::Extract будет пытаться использовать Archive ::Сначала заархивировать, а затем вернуться к двоичному файлу unzip в случае сбоя. Таким образом, кажется, что Archive::Zip является предпочтительным вариантом.

Archive::Zip использует Compress:: Raw::Zlib — низкоуровневый интерфейс к системной библиотеке zlib; так что это не чистая реализация Perl, что означает, что по производительности она будет похожа на unzip. Другими словами, с точки зрения производительности нет причин выбирать unzip перед Archive::Zip.

person Dave Webb    schedule 03.11.2009
comment
Если вы используете Archive::Extract, то он будет работать и для других форматов сжатия. - person Brad Gilbert; 03.11.2009

Если вы запустите двоичный файл unzip, ваш процесс разветвится/выполнится и

  1. создать новый процесс
  2. потреблять больше памяти (на время порожденного процесса)

Вам также необходимо указать правильный путь к unzip. Учитывая все это, я бы предпочел библиотечный подход.

person Brian Agnew    schedule 03.11.2009
comment
Я никогда не понимаю такого мышления. Fork/exec — это очень быстрый процесс, и любой, кто когда-либо читал или писал сценарии оболочки, знает об этом. Память, потребляемая самим распаковываемым бинарником, ничтожна по сравнению со стоимостью алгоритма и (особенно) данных в нем. И /usr/bin/unzip поставляется по умолчанию в каждом дистрибутиве Linux, и я думаю, что BSD и Cygwin тоже. Если у вас нет такого тривиального кода, как: open my $input, "unzip -cp $ARCHIVE $FILE |", я бы предпочел простой вариант. - person Andy Ross; 03.11.2009
comment
Хотя я согласен с приведенным выше в целом, если у вас сильно загруженный сервер, то потребление ресурсов увеличится при использовании модели fork/exec. Распределение pid, распределение потоков между процессами, выделение памяти (с возможностью копирования при записи). Для автономных процессов я доволен моделью fork/exec. Для серверных моделей я предпочитаю избегать этого в пользу модели с наименьшим объемом выделяемых ресурсов. - person Brian Agnew; 03.11.2009
comment
Если вы разветвляете цикл, особенно горячий цикл, вы обязательно увидите проблемы с производительностью. Если вы не находитесь в цикле или разветвляетесь со скоростью один раз в секунду или раз в несколько секунд, тогда нет проблем. Кроме того, использование библиотеки вместо системной команды unzip может быть преимуществом; библиотека может быть новее и менее глючной. - person Daniel S. Sterling; 11.04.2013

Одна проблема связана с памятью. На собственном горьком опыте мы обнаружили (авария рабочего веб-сервера), что Archive::Tar имеет утечку памяти. Таким образом, хотя в целом использование модуля вместо системного вызова внешней команды является хорошей идеей (см. другие ответы для рассуждений), вам необходимо убедиться, что модуль не имеет ошибок.

person DVK    schedule 04.11.2009