PHP實現實時生成并下載超大數據量的EXCEL文件詳解

更新:2017-10-27    編輯:笑卉    來源:哥乖整理    人氣:加載中...    字號:|

標簽:實現  詳解  數據  生成  文件  實時  百度搜索

前言

最近在工作中接到一個需求,通過選擇的光陰段導出對應的用戶造訪日志到excel中, 由于用戶量較大,經常會有導出50萬加數據的情況。而常用的PHPexcel包需要把所有數據拿到后才干生成excel, 在面對生成超大數據量的excel文件時這顯然是會造成內存溢出的,所以考慮應用讓PHP邊寫入輸出流邊讓涉獵器下載的形式來完成需求。

我們通過如下的方式寫入PHP輸出流

$fp = fopen('php://output', 'a'); fputs($fp, 'strings'); .... .... fclose($fp)

php://output是一個可寫的輸出流,允許程序像操作文件一樣將輸出寫入到輸出流中,PHP會把輸出流中的內容發送給web服務器并返回給發起請求的涉獵器

另外由于excel數據是從數據庫里逐步讀出然后寫入輸出流的所以需要將PHP的履行光陰設長一點(默認30秒)set_time_limit(0)不對PHP履行光陰做限制。

注:以下代碼只是闡明生成大數據量EXCEL的思路和步驟,并且在去掉項目業務代碼后程序有語法差錯不能拿來直接運行,請根據自己的需求填充對應的業務代碼!

/** * 文章造訪日志 * 下載的日志文件通常很大, 所以先設置csv相關的Header頭, 然后打開 * PHP output流, 漸進式的往output流中寫入數據, 寫到一定量后將系統緩沖沖刷到響應中 * 避免緩沖溢出 */ public function articleAccessLog($timeStart, $timeEnd) { set_time_limit(0); $columns = [ '文章ID', '文章標題', ...... ]; $csvFileName = '用戶日志' . $timeStart .'_'. $timeEnd . '.xlsx'; //設置好奉告涉獵器要下載excel文件的headers header('Content-Description: File Transfer'); header('Content-Type: application/vnd.ms-excel'); header('Content-Disposition: attachment; filename="'. $fileName .'"'); 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流中 $accessNum = '1000000'//從數據庫獲取總量,,假設是一百萬 $perSize = 1000;//每次查詢的條數 $pages = ceil($accessNum / $perSize); $lastId = 0; for($i = 1; $i <= $pages; $i++) { $accessLog = $logService->getArticleAccessLog($timeStart, $timeEnd, $lastId, $perSize); foreach($accessLog as $access) { $rowData = [ ......//每一行的數據 ]; mb_convert_variables('GBK', 'UTF-8', $rowData); fputcsv($fp, $rowData); $lastId = $access->id; } unset($accessLog);//釋放變量的內存 //刷新輸出緩沖到涉獵器 ob_flush(); flush();//必須同時應用 ob_flush() 和flush() 函數來刷新輸出緩沖。 } fclose($fp); exit(); }

好了, 其實很簡單,就是用逐步寫入輸出流并發送到涉獵器讓涉獵器去逐步下載全部文件,由于是逐步寫入的無法獲取文件的總體size所以就沒辦法通過設置header("Content-Length: $size");在下載前奉告涉獵器這個文件有多大了。不過不影響整體的效果這里的核心問題解決大文件的實時生成和下載。

總結



評論列表(網友評論僅供網友表達個人看法,并不表明本站同意其觀點或證實其描述)

站點導航

您可能在找這些
黑龙江快乐十分走势图