평범한 이야기들

[PHP] CSV 파일로 다운로드 받기 ( PHPExcel 메모리 문제) 본문

평범한 개발 이야기/PHP

[PHP] CSV 파일로 다운로드 받기 ( PHPExcel 메모리 문제)

songsariya 2021. 6. 29. 15:44
728x90

 사용자 화면에서 DB의 데이터를 받기 위해서 PHPExcel를 사용했었는데 PHPExcel은 메모리 많이 잡아먹으면서 시간도 오래 걸리는 문제가 있습니다. 그래서 보통 아래와 같이 PHPExcel 사용 전에 선언하고 합니다.

 

<?php

ini_set('memory_limit','2048M');
set_time_limit(9999999);

// 아래는 PHPExcel를 이용해 엑셀 다운로드 로직

 

보통 해당 설정으로 어느 정도 커버가 가능했는데 10만 건을 다운받으면서 CloudFlare에서 Timeout 오류를 내기 시작했습니다. 그래서 PHPExcel에서 CSV 파일로 다운로드할 수 있게 수정을 했습니다.

 

<?php

function downloadArryToCSV($array, $filename = "export.csv", $separator = ",") {
    
    // 메모리 이용 php://memory
    // 또는 파일명 사용
    $f = fopen('파일명', 'w');

    foreach ($array as $line) {
        fputcsv($f, $line, $separator);
    }

    fseek($f, 0);

    header('Content-Type: application/csv; charset=euc-kr');
    header('Content-Disposition: attachment; filename="' . $filename . '";');    

    fpassthru($f);
}

 

fputcsv : PHP에서 제공하는 함수로 배열을 이용해 CSV 파일을 만든다.

fpassthru : PHP에서 제공하는 함수로 리소스(파일) 이 끝날 때까지 열린 파일의 현재 위치로부터 모든 데이터를 출력 버퍼에 입력

 

이렇게 수정해서 10만 건 이상 되는 데이터 ROW를 CSV 파일로 다운로드 진행하게 되었습니다.

 

728x90
Comments