2015-05-28 11 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); 

}    

Używam powyższej funkcji do pobierania danych, konwersji do pliku CSV i wysyłania danych do przeglądarki. Dwa pytania:Tworzenie pliku CSV w pamięci, wiadomości e-mail i usuwanie z pamięci

  1. Czy plik został usunięty z pamięci po pobraniu przez HTTP?
  2. W jaki sposób można tę samą funkcję przepisać tak, aby plik mógł zostać użyty (na przykład, aby użyć jako załącznika wiadomości e-mail wysłanego za pomocą PHPMailera), a następnie natychmiast usunięty z pamięci?

EDIT: Kodeks Pracy - Ale zapisuje do pliku, a nie pamięć

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); 

} 

Wciąż bez odpowiedzi: czy pierwotna funkcja usunąć plik z pamięci, czy nie?

+1

ja po prostu zapisać plik w systemie plików ('/ tmp' na przykład), wysyłać pocztę (z załącznikiem) , a następnie wywołaj 'unlink()' na nazwie pliku. –

+0

Więc zmień pierwszą linię na $ temp_file = fopen ('/ tmp/abc.csv', 'w'), utwórz plik, a następnie zamień fseek >> fpassthru na return $ temp_file, kontynuując w funkcji nadrzędnej za pomocą unlink ($ temp_file)? – FurryWombat

+0

coś w tym stylu, tak. Nie zapomnij najpierw "fclose()" pliku. (przed 'unlink()') –

Odpowiedz

7

Chciałbym skorzystać PHP temp fopen opakowanie wraz z progu pamięci tak:

// 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) 

Próg jest pamięć 1MB. Jeśli plik CSV będzie większy, PHP utworzy tymczasowy plik, w przeciwnym razie wszystko stanie się w pamięci. Zaletą jest to, że duże pliki CSV nie wyczerpią pamięci.

Drugie pytanie, fclose(), spowoduje zwolnienie pamięci.

kiedyś napisał blogu odnośnie do tego, może okazać się interesujące: http://www.metashock.de/2014/02/create-csv-file-in-memory-php/

+0

co się dzieje, gdy inny proces (użytkownik) uruchamia ten sam skrypt, a plik tymczasowy również musi zostać utworzony: czy każdy plik tymczasowy ma unikatową nazwę? Żeby nie zostały nadpisane? – Andrew

+0

na pewno, to jest bezpieczne. – hek2mgl

+0

A jeśli potrzebuję 'file_path', do użycia w innej funkcji (coś jak CurlFile()), to ścieżka byłaby cała "php: // temp/maxmemory: 1048576"? – Andrew