摘要:實際工作中,我們經常導出報表的需求,當導出數據量過大的時候,經常會遇到超時和內存溢出的問題。解決方案一超時可用解決。獲取數據,根據自己的業務邏輯,去數據庫獲取數據。
實際工作中,我們經常導出報表的需求,當導出數據量過大的時候,經常會遇到超時和內存溢出的問題。
解決方案一
超時可用: set_time_limit(0) 解決。
內存溢出可用: ini_set("memory_limit", "自定義內存")。
解決方案二
優化程序,利用數據庫或文件來緩存中間結果。
解決方案三
利用Ajax分多次請求,寫入文件,下載文件,效果如上圖。
(方案三)為大家提供一個Demo
設計思路
我們將其拆成100次請求,請求成功,進度條前進1%。
每次請求都需要寫入文件,然后對文件進行追加寫入。
當文件寫入完畢后,顯示下載按鈕 ,點擊下載即可。
功能點
兩種進度條樣式。
Jquery Ajax。
數據寫入CSV。
下載文件。
頁面樣式:Bootstrap。
代碼如下
$value) { $header_data[$key] = iconv("utf-8", "gbk", $value); } fputcsv($fp, $header_data); } $num = 0; //每隔$limit行,刷新一下輸出buffer,不要太大,也不要太小 $limit = 100000; //逐行取出數據,不浪費內存 $count = count($data); if ($count > 0) { for ($i = 0; $i < $count; $i++) { $num++; //刷新一下輸出buffer,防止由于數據過多造成問題 if ($limit == $num) { ob_flush(); flush(); $num = 0; } $row = $data[$i]; foreach ($row as $key => $value) { $row[$key] = iconv("utf-8", "gbk", $value); } fputcsv($fp, $row); } } fclose($fp); } /** * 下載文件 * @param string $file_url 文件地址 * @return string */ function _download_file ($file_url = "") { if (!isset($file_url) || trim($file_url)=="") { die("File URL is empty."); } if (!file_exists($file_url)) { die("File does not exist."); } $file_name = "down_".date("YmdHis", time()); $file_type = fopen($file_url,"r"); //打開文件 //輸入文件標簽 header("Content-type: application/octet-stream"); header("Accept-Ranges: bytes"); header("Accept-Length: ".filesize($file_url)); header("Content-Disposition: attachment; filename=".$file_name); //輸出文件內容 echo fread($file_type, filesize($file_url)); fclose($file_type); } //以后是邏輯代碼,大家可以根據自己的需求進行編寫。 $path = "文件的絕對地址"; //path 是存放文件的絕對地址。 if (isset($_POST["start"])) { //每一個多帶帶的請求,要保證文件名是唯一的,因為后面要繼續進行追加。 $file_name = "demo.csv"; //獲取數據,根據自己的業務邏輯,去數據庫獲取數據。 $data = []; $header_data = ["執行時間", "隨機數"]; //首行數據,表頭 //模擬數據如下: for ($i=0; $i<=100; $i++) { $data[$i]["time"] = date("Y-m-d H:i:s", time()); $data[$i]["num"] = mt_rand(1000,9999); } $type = ($_POST["start"] != "0") ? 1 : 0 ; //開始將數據寫入到文件中 _export_csv($data, $header_data, $path.$file_name, $type); //假設第100次 寫入完畢,那么就可以進行下載文件啦。 //可以先獲取需要導出的總量,然后根據實際情況進行拆分數據,每次獲取成功,進度條會顯示進度。 if ($_POST["start"] == 100) { die(json_encode(["code" => "ok", "file_path" => "/index.php?op=down&f=".$file_name])); } else { die(json_encode(["code" => "no"])); } } //簡單的導出邏輯,可根據實際情況,進行開發。 if (($_GET["op"] == "down") && !empty($_GET["f"])) { _download_file($path.$_GET["f"]); exit; } ?>Demo
溫馨提示:
Demo 僅供參考,具體開發,請根據需求,嚴謹處理。
Thanks ~
AD:
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/21904.html
摘要:說明這里用到的項目都是基于的項目。但同時,它和其他的分布式文件系統的區別也是很明顯的。能提供高吞吐量的數據訪問,非常適合大規模數據集上的應用。放寬了一部分約束,來實現流式讀取文件系統數據的目的。是項目的一部分。 關鍵詞 Java、PHP、hdfs、mqrocket、excel、poi、報表 需求背景 在業務需求方面,每個企業或多或少都會有報表導出的作業,量少則可是使用輸出流或者字符串的...
摘要:說明這里用到的項目都是基于的項目。但同時,它和其他的分布式文件系統的區別也是很明顯的。能提供高吞吐量的數據訪問,非常適合大規模數據集上的應用。放寬了一部分約束,來實現流式讀取文件系統數據的目的。是項目的一部分。 關鍵詞 Java、PHP、hdfs、mqrocket、excel、poi、報表 需求背景 在業務需求方面,每個企業或多或少都會有報表導出的作業,量少則可是使用輸出流或者字符串的...
摘要:年月日本文是關于記錄某次游戲服務端的性能優化此處涉及的技術包括引擎隨著游戲導入人數逐漸增加單個集合的文檔數已經超過經常有玩家反饋說卡特別是在服務器遷移后從核降到核卡頓更嚴重了遂開始排查問題確認服務器壓力首先使用命令查看總體情況此時占用不高 Last-Modified: 2019年6月13日11:08:19 本文是關于記錄某次游戲服務端的性能優化, 此處涉及的技術包括: MongoDB...
摘要:年月日本文是關于記錄某次游戲服務端的性能優化此處涉及的技術包括引擎隨著游戲導入人數逐漸增加單個集合的文檔數已經超過經常有玩家反饋說卡特別是在服務器遷移后從核降到核卡頓更嚴重了遂開始排查問題確認服務器壓力首先使用命令查看總體情況此時占用不高 Last-Modified: 2019年6月13日11:08:19 本文是關于記錄某次游戲服務端的性能優化, 此處涉及的技術包括: MongoDB...
閱讀 1895·2021-11-15 11:46
閱讀 1091·2021-10-26 09:49
閱讀 1825·2021-10-14 09:42
閱讀 3384·2021-09-26 09:55
閱讀 838·2019-08-30 13:58
閱讀 1039·2019-08-29 16:40
閱讀 3474·2019-08-26 10:27
閱讀 611·2019-08-23 18:18