php 匯出大量資料到資料表
阿新 • • 發佈:2020-12-31
大資料量一般方式匯出存在哪些問題?
需要匯出的資料一般都是從資料庫中讀取,然後執行匯出操作。
一般方式匯出(資料量少的方式匯出)是先一次性從資料讀取所需的資料,然後執行一次性匯出操作。
百萬級大資料量如果按這種方式匯出,主要會遇到哪些問題呢?
執行時間長,很容易超時
伺服器記憶體不夠,百萬級的資料從資料庫一次性讀取消耗的記憶體會導致伺服器記憶體不夠,從而導致匯出失敗
匯出的excel檔案比較大,且excel有行數限制
如何解決執行時間長,很容易超時問題
set_time_limit (0); //取消指令碼執行時間的限制
如何解決伺服器記憶體不足問題
百萬級的資料從資料庫一次性讀取改為分頁讀取,採用fputcsv,使用output流, 漸進式的往output流中寫入資料, 寫到一定量後將系統緩衝沖刷到響應中(增量匯出)
如何解決匯出的excel檔案比較大及excel匯出行數限制問題
php匯出資料到csv檔案。csv相比於excel檔案有其一定的優勢,首先csv對資料的行數沒有限制,但是excel對資料的行數有一定的限制,而且csv檔案佔用空間比excel檔案小
set_time_limit(0);//取消指令碼執行時間的限制 ini_set('memory_limit', '1024M');//設定記憶體限制 $columns = [ '列名1', '列名2', '列名3' //需要幾列,定義好列名 ]; //設定好告訴瀏覽器要下載csv檔案的headers $fileName = 'test';header("Content-Disposition: attachment; filename=\"" . $fileName . ".csv\""); header('Content-Type:APPLICATION/OCTET-STREAM'); $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)->select(); 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();