php大量資料匯出csv
阿新 • • 發佈:2022-04-12
在PHP開發的過程中有時候會有資料需要匯出,可以利用各種框架中的一些包來直接獲取資料然後丟入對應的處理方法就行了,但是當遇到大量的資料需要匯出的時候,我們就需要用其他的方法來實現了。
一般處理大資料有如下幾種解決辦法: 通過新增或者修改事件觸發指令碼,生成資料;定時任務執行指令碼生成資料;直接使用phpexcel匯出大量資料;採用fputcsv實時資料流方式寫入。用一張圖表示如下:
這裡主要記錄下使用fputcsv方式匯出資料。
public function exportData() { set_time_limit(0); ini_set('memory_limit', '1024M'); $columns = [ '列名1', '列名2', '列名3' //需要幾列,定義好列名 ]; //設定好告訴瀏覽器要下載excel檔案的headers header('Content-Description: File Transfer'); header('Content-Type: application/vnd.ms-excel'); header('Content-Disposition: attachment; filename="匯出資料-'.date('Y-m-d', time()).'.csv"'); header('Expires: 0'); header('Cache-Control: must-revalidate'); header('Pragma: public'); $fp = fopen('php://output', 'a');//開啟output流 mb_convert_variables('GBK', 'UTF-8', $columns); fputcsv($fp, $columns);//將資料格式化為CSV格式並寫入到output流中 //新增查詢條件,獲取需要的資料$query = Model::class()->where(); //獲取總數,分頁迴圈處理 $accessNum = $query->count(); $perSize = 1000; $pages = ceil($accessNum / $perSize); for($i = 1; $i <= $pages; $i++) { $db_data = $query->limit($perSize)->offset(($i-1)*$perSize)->get(); foreach($db_data as $key => $value) { $rowData = []; //獲取每列資料,轉換處理成需要匯出的資料 //需要格式轉換,否則會亂碼 mb_convert_variables('GBK', 'UTF-8', $rowData); fputcsv($fp, $rowData); } //釋放變數的記憶體 unset($db_data); //重新整理輸出緩衝到瀏覽器 ob_flush(); //必須同時使用 ob_flush() 和flush() 函式來重新整理輸出緩衝。 flush(); } fclose($fp); exit(); }
這樣會一邊生成,一邊寫入下載檔案,提高處理速度。
之前使用的包處理,生成一個25M的資料,要20分鐘。這種方式處理需要1分多鐘(也和實際處理的環境有關)。