2009-11-03 8 views
7

Potrzebuję umożliwić użytkownikom przesyłanie pliku zip za pomocą formularza internetowego. Serwer działa pod kontrolą systemu Linux z serwerem WWW Apache. Czy istnieją zalety korzystania z modułu takiego jak Archive::Zip w celu wyodrębnienia tego archiwum, czy też powinienem wykonać wywołanie systemowe pod numerem unzip za pomocą odsunięć?Jak mogę wyodrębnić skompresowane archiwum w Perlu?

Odpowiedz

5

Jeśli wykonanie binarnego unzip, Twój proces będzie bulić/exec i

  1. wystąpienia nowego procesu
  2. zużywają więcej pamięci (na czas trwania zrodził procesu)

You Będziesz musiał również skonfigurować poprawną ścieżkę do unzip. Biorąc pod uwagę to wszystko, zdecydowanie wolałbym podejście biblioteki.

+3

Nigdy nie rozumiem tego rodzaju myślenia. Widelec/exec to bardzo szybki proces, o którym wie każdy, kto spędził jakiś czas czytając lub pisząc skrypty powłoki. Pamięć zużywana przez rozpakowywanie binarne sama w sobie jest trywialna w porównaniu do kosztów algorytmu i (szczególnie) danych w nim zawartych. I/usr/bin/unzip statki domyślnie na każdej dystrybucji Linuksa, i wierzę, że BSD i Cygwin też. Jeśli nie masz przykładowego kodu tak trywialnego jak: 'otwórz moje wejście $," unzip -cp $ ARCHIVE $ FILE | "', zdecydowanie wolałbym tę prostą opcję. –

+1

Chociaż zgadzam się z powyższym * ogólnie *, jeśli masz mocno obciążony serwer, zużycie zasobów wzrośnie w modelu fork/exec. Przydział pidów, alokacja strumienia między procesami, alokacja pamięci (pozwalająca na kopiowanie przy zapisie). W przypadku procesów autonomicznych jestem zadowolony z modelu fork/exec. W przypadku modeli serwerowych wolę unikać tego w stosunku do modelu przy najmniejszej alokacji zasobów. –

+1

Jeśli tworzysz pętlę, szczególnie gorącą pętlę, absolutnie zobaczysz problemy z wydajnością. Jeśli nie jesteś w pętli, lub jeśli rozwidlasz się w tempie raz na sekundę lub raz na kilka sekund, to nie ma problemu. Używanie biblioteki zamiast polecenia 'unzip' może być zaletą; biblioteka może być nowsza i mniej błędna. –

14

Według Archive::Zip documentation byłbyś lepiej wyłączyć za pomocą Archive::Extract:

Jeśli tylko będzie zamki wydobywające (i/lub inne archiwa) zaleca się przyjrzeć przy użyciu Archive :: Extract zamiast tego, ponieważ jest znacznie łatwiejszy w użyciu i wpływa na funkcjonalność specyficzną dla archiwum.

To interesujące, ponieważ Archive::Extract will try Archive::Zip first and then fall back to the unzip binary if it fails. Wygląda na to, że opcja Archiwum :: Zip jest preferowana.

Archiwum :: Zip używa Compress::Raw::Zlib, który jest niskim poziomem interfejsu do biblioteki systemu zlib; więc nie jest to czysta implementacja Perla, co oznacza, że ​​będzie podobna pod względem wydajności do unzip. Innymi słowy, z perspektywy wydajności nie ma powodu, aby wybierać unzip przed Archiwum :: Zip.

+3

Jeśli użyjesz 'Archive :: Extract', to będzie również działać dla innych formatów kompresji. –

1

Jedna sprawa dotyczy pamięci. Znaleźliśmy trudną drogę (awaryjny serwer produkcyjny), który spowodował wyciek pamięci. Więc podczas gdy ogólnie używanie modułu zamiast wywoływania systemu do zewnętrznego polecenia jest dobrym pomysłem (zobacz inne odpowiedzi na uzasadnienie), musisz upewnić się, że moduł nie ma gotch.

Powiązane problemy