Мне нужно разрешить пользователям загружать zip-файл через веб-форму. Сервер работает под управлением Linux с веб-сервером Apache. Есть ли преимущества в использовании модуля типа Archive::Zip для извлечения этого архива или я должен просто выполнить системный вызов unzip
с обратными кавычками?
Как я могу извлечь сжатый архив в Perl?
Ответы (3)
Согласно Archive::Zip документации лучше использовать Архив::Извлечение:
Если вы просто собираетесь извлекать zip-файлы (и/или другие архивы), вам рекомендуется вместо этого использовать Archive::Extract, так как он намного проще в использовании и не учитывает специфические для архива функции.
Это интересно, потому что Archive::Extract будет пытаться использовать Archive ::Сначала заархивировать, а затем вернуться к двоичному файлу unzip
в случае сбоя. Таким образом, кажется, что Archive::Zip является предпочтительным вариантом.
Archive::Zip использует Compress:: Raw::Zlib — низкоуровневый интерфейс к системной библиотеке zlib; так что это не чистая реализация Perl, что означает, что по производительности она будет похожа на unzip
. Другими словами, с точки зрения производительности нет причин выбирать unzip
перед Archive::Zip.
Archive::Extract
, то он будет работать и для других форматов сжатия.
- person Brad Gilbert; 03.11.2009
Если вы запустите двоичный файл unzip
, ваш процесс разветвится/выполнится и
- создать новый процесс
- потреблять больше памяти (на время порожденного процесса)
Вам также необходимо указать правильный путь к unzip
. Учитывая все это, я бы предпочел библиотечный подход.
open my $input, "unzip -cp $ARCHIVE $FILE |"
, я бы предпочел простой вариант.
- person Andy Ross; 03.11.2009
unzip
может быть преимуществом; библиотека может быть новее и менее глючной.
- person Daniel S. Sterling; 11.04.2013
Одна проблема связана с памятью. На собственном горьком опыте мы обнаружили (авария рабочего веб-сервера), что Archive::Tar
имеет утечку памяти. Таким образом, хотя в целом использование модуля вместо системного вызова внешней команды является хорошей идеей (см. другие ответы для рассуждений), вам необходимо убедиться, что модуль не имеет ошибок.