2015-05-28 13 views
7
private function convert_to_csv($input_array, $output_file_name, $delimiter) { 

    $temp_memory = fopen('php://memory','w'); 

    foreach ($input_array as $line) { 

     fputcsv($temp_memory, $line, $delimiter); 

    } 

    fseek($temp_memory, 0); 

    header('Content-Type: application/csv'); 
    header('Content-Disposition: attachement; filename="' . $output_file_name . '";'); 

    fpassthru($temp_memory); 

}    

मैं उपरोक्त फ़ंक्शन का उपयोग डेटा की एक सरणी लेने, CSV में कनवर्ट करने और ब्राउज़र में आउटपुट करने के लिए करता हूं। दो प्रश्न:मेमोरी, ईमेल, और मेमोरी से हटाएं

  1. क्या फ़ाइल HTTP के माध्यम से डाउनलोड होने के बाद स्मृति से हटा दी गई है?
  2. यह वही फ़ंक्शन कैसे लिखा जाएगा कि फ़ाइल का उपयोग किया जा सकता है (उदाहरण के लिए, PHPMailer के साथ भेजे गए ईमेल अनुलग्नक के रूप में उपयोग करने के लिए) और उसके बाद तुरंत स्मृति से हटा दिया गया?

संपादित करें: वर्किंग कोड - लेकिन फाइल करने के लिए लिखते हैं, नहीं स्मृति

public function emailCSVTest() { 

    $test_array = array(array('Stuff','Yep'),array('More Stuff','Yep yep')); 

    $temp_file = '/tmp/temptest.csv'; 

    $this->convertToCSV($test_array, $temp_file); 

    $this->sendUserEmail('Test Subject','Test Message','[email protected]',$temp_file); 

    unlink($temp_file); 

} 

private function convertToCSV($input_array, $output_file) { 

    $temp_file = fopen($output_file,'w'); 

    foreach ($input_array as $line) { 

     fputcsv($temp_file, $line, ','); 

    } 

    fclose($temp_file); 

} 

फिर भी अनुत्तरित: मूल कार्य स्मृति से फ़ाइल को हटा करता है या नहीं?

+1

मैं सिर्फ फाइल सिस्टम ('उदाहरण के लिए/tmp') पर फ़ाइल की दुकान होगी, (अनुलग्नक के साथ) मेल भेजने , और बाद में फ़ाइल नाम पर 'अनलिंक() 'पर कॉल करें। –

+0

तो पहली पंक्ति को $ temp_file = fopen ('/ tmp/abc.csv', 'w') में बदलें, फ़ाइल बनाएं, फिर ficek >> fpassthru को $ temp_file के साथ बदलें, अनलिंक के साथ मूल फ़ंक्शन में अनुसरण करें ($ temp_file)? – FurryWombat

+0

ऐसा कुछ, हाँ। पहले फाइल को 'fclose()' को मत भूलना। ('अनलिंक() 'से पहले) –

उत्तर

7

मैं इस तरह स्मृति की दहलीज के साथ एक साथ उपयोग PHP के temp fopen आवरण बनाना होगा:

// we use a threshold of 1 MB (1024 * 1024), it's just an example 
$fd = fopen('php://temp/maxmemory:1048576', 'w'); 
if($fd === FALSE) { 
    die('Failed to open temporary file'); 
} 

$headers = array('id', 'name', 'age', 'species'); 
$records = array(
    array('1', 'gise', '4', 'cat'), 
    array('2', 'hek2mgl', '36', 'human') 
); 

fputcsv($fd, $headers); 
foreach($records as $record) { 
    fputcsv($fd, $record); 
} 

rewind($fd); 
$csv = stream_get_contents($fd); 
fclose($fd); // releases the memory (or tempfile) 

स्मृति treshold 1MB है। यदि सीएसवी फ़ाइल बड़ी हो जाती है, तो PHP एक अस्थायी फ़ाइल बनायेगा, अन्यथा सभी स्मृति में होंगे। लाभ यह है कि बड़ी CSV फ़ाइलें स्मृति को समाप्त नहीं करेंगे।

आपके दूसरे प्रश्न के बारे में, fclose() स्मृति जारी करेगा।

मैं एक बार यह करने के लिए के बारे में एक ब्लॉग लेख लिखा था, आप इसे दिलचस्प हो सकता है: http://www.metashock.de/2014/02/create-csv-file-in-memory-php/

+0

क्या होता है जब कोई अन्य प्रक्रिया (उपयोगकर्ता) एक ही स्क्रिप्ट चलाती है और temp फ़ाइल भी बनाई जानी चाहिए: क्या प्रत्येक अस्थायी फ़ाइल में अद्वितीय फ़ाइल नाम होगा? ताकि वे अधिलेखित नहीं होंगे? – Andrew

+0

यकीन है, यह सुरक्षित है। – hek2mgl

+0

और यदि मुझे अन्य फ़ंक्शन (CurlFile() जैसे कुछ) में उपयोग करने के लिए 'file_path' की आवश्यकता है, तो पथ संपूर्ण 'php: // temp/maxmemory: 1048576' होगा? – Andrew

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