2009-11-03 16 views
7

मुझे उपयोगकर्ताओं को एक वेब फ़ॉर्म के माध्यम से एक ज़िप फ़ाइल अपलोड करने की अनुमति देने की आवश्यकता है। सर्वर एक अपाचे वेब सर्वर के साथ लिनक्स चला रहा है। क्या इस संग्रह को निकालने के लिए Archive::Zip जैसे मॉड्यूल का उपयोग करने के फायदे हैं या क्या मुझे बैकटिक्स के साथ unzip पर सिस्टम कॉल निष्पादित करना चाहिए?मैं पर्ल में संपीड़ित संग्रह कैसे निकाल सकता हूं?

उत्तर

5

आप द्विआधारी unzip पर अमल करते हैं, तो आपके प्रक्रिया/कार्यकारी और

  1. एक नई प्रक्रिया
  2. का उपभोग अधिक स्मृति का दृष्टांत (पैदा की प्रक्रिया की अवधि के लिए)

आप कांटा होगा unzip के सही पथ के साथ भी कॉन्फ़िगर करना होगा। यह सब देखते हुए, मैं लाइब्रेरी दृष्टिकोण को दृढ़ता से पसंद करूंगा।

+3

मैं इस तरह की सोच को कभी समझ नहीं पा रहा हूं। एक कांटा/निष्पादन एक बहुत तेज़ प्रक्रिया है, जो भी शेल स्क्रिप्ट पढ़ने या लिखने में व्यतीत होता है, उसे इस बारे में पता है। अनजिप बाइनरी द्वारा खपत की गई स्मृति एल्गोरिदम की लागत और (विशेष रूप से) डेटा की तुलना में तुच्छ है। और प्रत्येक लिनक्स वितरण पर डिफ़ॉल्ट रूप से/usr/bin/unzip जहाजों, और मुझे विश्वास है कि बीएसडी और सिगविन भी। जब तक आपके पास नमूना कोड छोटा नहीं है: 'मेरा $ इनपुट खोलें,' unzip -cp $ $ $ FILE | "', मैं दृढ़ विकल्प को दृढ़ता से पसंद करूंगा। –

+1

जबकि मैं उपर्युक्त * आम तौर पर * से सहमत हूं, यदि आपके पास भारी लोड सर्वर है, तो आपकी संसाधन खपत कांटा/निष्पादन मॉडल के साथ बढ़ेगी। पिड आवंटन, अंतर-प्रक्रिया धारा आवंटन, स्मृति आवंटन (प्रतिलिपि लिखने की अनुमति)। स्टैंड-अलोन प्रक्रियाओं के लिए मैं कांटा/निष्पादन मॉडल से खुश हूं। सर्वर मॉडल के लिए मैं कम से कम संसाधन आवंटन के साथ इस मॉडल से दूर शर्मना पसंद करता हूं। –

+1

यदि आप लूप में फोकस कर रहे हैं, खासकर एक हॉट लूप, तो आप बिल्कुल प्रदर्शन के मुद्दों को देखेंगे। यदि आप लूप में नहीं हैं, या यदि आप एक बार एक बार या प्रत्येक कुछ सेकंड में एक बार की दर से फोकस कर रहे हैं, तो कोई समस्या नहीं है। साथ ही, सिस्टम 'unzip' कमांड के बजाए लाइब्रेरी का उपयोग करना लाभ हो सकता है; पुस्तकालय नई और कम छोटी गाड़ी हो सकती है। –

14

Archive::Zip documentation के अनुसार आप Archive::Extract का उपयोग कर बेहतर होगा:

तुम सिर्फ निकालने ज़िप (और/या अन्य अभिलेखागार) आप आर्काइव का उपयोग कर को देखने के लिए सिफारिश कर रहे हैं होने के लिए जा रहे हैं :: निकालें इसके बजाए, क्योंकि इसका उपयोग करना बहुत आसान है और संग्रह-विशिष्ट कार्यक्षमता को कारक बनाता है।

यह दिलचस्प है क्योंकि Archive::Extract will try Archive::Zip first and then fall back to the unzip binary if it fails. तो ऐसा लगता है कि पुरालेख :: ज़िप पसंदीदा विकल्प है।

संग्रह :: ज़िप Compress::Raw::Zlib का उपयोग करता है जो zlib सिस्टम लाइब्रेरी के लिए निम्न स्तर का इंटरफ़ेस है; इसलिए यह एक शुद्ध पर्ल कार्यान्वयन नहीं है जिसका अर्थ है कि यह unzip पर प्रदर्शन में समान होगा। इसलिए, दूसरे शब्दों में, प्रदर्शन परिप्रेक्ष्य से संग्रह :: ज़िप से आगे unzip चुनने का कोई कारण नहीं है।

+3

यदि आप 'आर्काइव :: एक्सट्रैक्ट' का उपयोग करते हैं, तो यह अन्य संपीड़न प्रारूपों के लिए भी काम करेगा। –

1

एक चिंता स्मृति के साथ है। हमें कठिन तरीका मिला है (उत्पादन वेब सर्वर दुर्घटनाग्रस्त) कि Archive::Tar में स्मृति रिसाव था। इसलिए जब बाहरी आदेश के लिए सिस्टम कॉल के बजाय मॉड्यूल का उपयोग करना एक अच्छा विचार है (तर्क के लिए अन्य प्रतिक्रियाएं देखें), तो आपको यह सुनिश्चित करने की आवश्यकता है कि मॉड्यूल में कोई गठिया नहीं है।