在内存中创建CSV,发送电子邮件并从内存中删除

时间:2015-05-28 15:29:42

标签: php file memory

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一起发送的电子邮件附件),然后立即从内存中删除?
  3. 编辑:工作代码 - 但是写入文件,而不是内存

    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','nowhere@bigfurryblackhole.com',$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 个答案:

答案 0 :(得分:11)

我会使用PHP' s 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)

内存阈值为1MB。如果CSV文件变大,PHP会创建一个临时文件,否则所有文件都会在内存中发生。优点是大CSV个文件不会耗尽内存。

关于第二个问题,fclose()会释放记忆。

我曾写过一篇关于此的博客文章,你可能会觉得有趣:http://www.metashock.de/2014/02/create-csv-file-in-memory-php/