2009-07-27 9 views
26

मैं PHP में ऑन-द-फ्लाई संग्रह बनाने की कोशिश कर रहा हूं और इसे तुरंत उपयोगकर्ता को भेज रहा हूं (इसे सहेजे बिना)। मुझे लगा कि डिस्क पर फ़ाइल बनाने की कोई आवश्यकता नहीं होगी क्योंकि मैं जिस डेटा को भेज रहा हूं वह लगातार नहीं है, हालांकि, वेब पर खोज करने पर, मुझे पता नहीं चला कि कैसे। मुझे फ़ाइल प्रारूप की भी परवाह नहीं है।PHP के साथ मेमोरी में एक आर्काइव का उपयोग करें (डिस्क पर अस्थायी फ़ाइल बनाये बिना)

तो, सवाल यह है:

इसे बनाने और रास्ते में एक tempfile बनाने के बिना एक PHP स्क्रिप्ट के भीतर स्मृति में एक फ़ाइल संग्रह हेरफेर करने के लिए संभव है?

+0

क्या इस संग्रह में केवल एक फ़ाइल या एक से अधिक फ़ाइल हो सकती है? – VolkerK

+0

मेरे विशिष्ट मामले में इसमें एक से अधिक शामिल हैं। इसके अलावा मुझे लगता है कि "मनमाने ढंग से" बड़े अभिलेखागार (आइटम-वार) के लिए एक समाधान अधिक दिलचस्प है (मेरे मामले में, मैं एक टेम्पफाइल का उपयोग कर सकता हूं, लेकिन उन लोगों के बारे में क्या है जो सर्वर का उपयोग करना चाहते हैं जहां उनकी पहुंच फाइल सिस्टम प्रतिबंधित है)? – ralokt

उत्तर

42

मुझे एक ही समस्या थी लेकिन अंततः कुछ हद तक अस्पष्ट समाधान मिला और इसे यहां साझा करने का फैसला किया।

मैं zip.lib.php/unzip.lib.php स्क्रिप्ट्स पर आया जो phpmyadmin के साथ आते हैं और "पुस्तकालय" निर्देशिका में स्थित हैं।

का उपयोग zip.lib.php मेरे लिए एक आकर्षण के रूप में काम किया:

require_once(LIBS_DIR . 'zip.lib.php'); 

... 

//create the zip 
$zip = new zipfile(); 

//add files to the zip, passing file contents, not actual files 
$zip->addFile($file_content, $file_name); 

... 

//prepare the proper content type 
header("Content-type: application/octet-stream"); 
header("Content-Disposition: attachment; filename=my_archive.zip"); 
header("Content-Description: Files of an applicant"); 

//get the zip content and send it back to the browser 
echo $zip->file(); 

यह स्क्रिप्ट एक ज़िप को डाउनलोड करने की अनुमति देता है, वास्तविक फ़ाइलों के रूप में फाइल होने या ज़िप अपने आप में एक फ़ाइल के रूप में बचाने के आवश्यकता के बिना।

यह एक शर्म की बात है कि यह कार्यक्षमता अधिक सामान्य PHP लाइब्रेरी का हिस्सा नहीं है। https://github.com/phpmyadmin/phpmyadmin/blob/RELEASE_4_5_5_1/libraries/zip.lib.php

अद्यतन: आप स्क्रिप्ट सिर्फ zip.lib.php की शुरुआत से के रूप में नहीं तो निम्न चेक निकालने के सुनिश्चित करें

यहाँ phpmyadmin स्रोत से zip.lib.php फ़ाइल का लिंक है समाप्त हो जाता है:

if (! defined('PHPMYADMIN')) { 
    exit; 
} 

अद्यतन: इस कोड के साथ-साथ CodeIgniter परियोजना पर उपलब्ध है: https://github.com/patricksavalle/CodeIgniter/blob/439ac3a87a448ae6c2cbae0890c9f672efcae32d/system/helpers/zip_helper.php

+0

आपको यह उल्लेख करना चाहिए कि आपको 'PHPMYADMIN' निरंतर परिभाषा के लिए चेक को हटाने के लिए इसे संशोधित करने की आवश्यकता है, या यह बस स्क्रिप्ट खत्म कर देगा। मुझे काम करने के लिए एक सेकंड से अधिक समय लगा। – Nathaniel

+0

धन्यवाद, ऐसा लगता है कि उपर्युक्त पोस्ट करने के बाद चेक पेश किया गया था जवाब। मैंने जवाब अपडेट किया। – nettle

+0

एक आकर्षण की तरह काम करता है। मैंने इसे कोडिग्निटर सहायक में बनाया है जिसमें कोई समस्या नहीं है। –

3

संग्रह बनाने के लिए आप क्या उपयोग कर रहे हैं? आप संग्रह php: // temp या php: // स्मृति को संग्रह में पढ़ने/लिखने के लिए उपयोग करने में सक्षम हो सकते हैं।

http://php.net/manual/en/wrappers.php.php

+1

फिलहाल, मैं PHP डाउनलोड एक्सटेंशन का उपयोग कर रहा हूं और जब भी मैं डाउनलोड करता हूं तो एक टेम्पफाइल लिख रहा हूं। मैंने php: // temp wrapper (यह पता लगाया कि यह php: // स्मृति से बेहतर था, क्योंकि डेटा की बड़ी मात्रा के साथ, एक tempfile एक अच्छा विचार है, और मेजबान एफएस एक्सेस को प्रतिबंधित करते समय भी इसका उपयोग करने की अनुमति दे सकता है मैं समस्या में भाग गया कि मुझे ज़िपफाइल को बंद करना पड़ा, जो कि php: // temp /। में बंद सब कुछ मुक्त कर दिया गया था (बंद करने से पहले और बाद में ज़िपफाइल से पढ़ना मुझे 0 बाइट्स दिया गया था।) वैसे भी, मैं नहीं करता हूं ' जब तक यह काम करता है, तब तक लाइब्रेरी का उपयोग करता हूं। PHP-internal को निश्चित रूप से प्राथमिकता दी जाएगी। – ralokt

-7

देखें वहाँ वास्तव में एक प्रदर्शन यहां मुद्दा यह है, या यह सिर्फ सच्चाई की भावना को ठेस करता है? कई प्रक्रियाएं अस्थायी फ़ाइलों को लिखती हैं और उन्हें हटाती हैं, और अक्सर वे कैशिंग के कारण डिस्क को कभी भी हिट नहीं करते हैं।

बंद होने पर एक tempfile स्वचालित रूप से हटा दिया जाता है। यह प्रकृति है।

मेमोरी में ज़िप फ़ाइल बनाने के लिए केवल दो तरीके हैं और इसकी सेवा करते हैं और दोनों शायद उनके लायक होने की तुलना में अधिक परेशानी हैं।

  • रैम डिस्क का उपयोग करें।
  • ziparchive क्लास को एक विधि जोड़ने के लिए संशोधित करें जो करीबी() विधि करता है, को छोड़कर वास्तव में फ़ाइल बंद करें। (या बंद करने के लिए एक छुट्टी-खुला पैरामीटर जोड़ें())।
    यह अंतर्निहित सी पुस्तकालयों के आधार पर भी संभव नहीं हो सकता है।
2

आपकी टिप्पणी के बारे में php: // temp आपके लिए इसे बंद करने के अलावा आपके लिए काम करता है, इसे खोलने की कोशिश करें, आउटपुट को फ्लश करें, फिर इसे 0 पर वापस रिवाइंड करें और इसे पढ़ें।

अधिक उदाहरण के लिए यहाँ देखो: http://us.php.net/manual/en/function.tmpfile.php

इसके अलावा अनुसंधान उत्पादन बफरिंग और कैप्चरिंग: http://us.php.net/manual/en/function.ob-start.php

0

आप ZipArchive::addFromString उपयोग करने की आवश्यकता है - अगर आप addFile() फ़ाइल वास्तव में नहीं जोड़ा जाता का उपयोग जब तक आप इसे बंद करने के लिए जाना। (भयानक बग IMHO, क्या होगा यदि आप फ़ाइलों को ज़िप में स्थानांतरित करने का प्रयास कर रहे हैं और आप ज़िप को बंद करने से पहले उन्हें हटा दें ...)
addFromString() विधि इसे तुरंत संग्रह में जोड़ती है।

संबंधित मुद्दे

 संबंधित मुद्दे