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