国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

我所經歷的大文件數據導出(后臺執行,自動生成)

2019-11-15 02:23:37
字體:
來源:轉載
供稿:網友
我所經歷的大文件數據導出(后臺執行,自動生成)一、前言

記錄一下以前做的后臺Excel格式導出統計信息的功能,也是最近同事問到了相關東西,一時之間竟忘了具體的細節,因此記錄一下;

大家知道,excel導出數據的功能,后臺幾乎是必須功能,一般都是點擊后,生成文件然后自動下載,

如果是數據量小的話,一下子便可請求完成,從而下載到本地;

但是,如果數據量特別大的時候,頁面就必須一直在等待,直到寫入excel成功,

這樣便影響了后臺使用者無法操作其他頁面,為此,對excel導出做了以下功能優化:

  1. excel導出分成兩部分內容:生成excel文件和下載excel文件
  2. excel的文件生成在程序后臺執行,前端不必等待,可進行其他后臺操作
  3. 增加下載文件頁面,顯示excel文件生成的進度,完成后,方可下載生成的excel文件
  4. 文件生成后,點擊下載方可下載相應的文件
二、生成excel文件

生成excel文件的方法有很多,暫不一一記錄,只是記錄本次的方法;

這里用到了table的html格式,以及相應的excel的聲明

(隱約記得其他的方法用office07打開的時候好像是亂碼,后面嘗試用csv格式文件,可還是亂碼,所以用了table的形式)

文件的開頭:

 1     $struserdata = <<<Eof 2         <html xmlns:o="urn:schemas-microsoft-com:office:office" 3         xmlns:x="urn:schemas-microsoft-com:office:excel" 4         xmlns="http://www.w3.org/TR/REC-html40"> 5      6         <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 7         <html> 8         <head> 9             <meta http-equiv="Content-type" content="text/html;charset=utf-8" />10         <style id="Classeur1_16681_Styles">11         </style>12         </head>13         <body>14         <div id="Classeur1_16681" align=center x:publishsource="Excel">15     16         <table x:str border=1 cellpadding=0 cellspacing=0 width=100% style='border-collapse: collapse'>17 Eof;
View Code

文件的結尾:

1 $struserdata = <<<Eof2         </table>3         </div>4         </body>5         </html>6 Eof;
View Code

當然,文件中間就是一些tr td 標簽了。

三、讓程序在后臺執行

場景:

用戶點擊 生成excel后,跳轉到下載頁面,程序在后臺執行,用戶可不必等待生成完成,可執行其他操作;

下載頁面可看到文件生成的進度以及是否可下載狀態

思路:

點擊 生成excel,顯示下載頁面 ---> show_download方法

生成excel ---> create_excel 方法

show_download方法中調用 create_excel方法,而show_download 方法中,自己用了一下命令行執行程序的方式,

利用php命令行的方式,把參數傳遞給 create_excel方法

1  // $cmd = "/usr/bin/php  /home/xxx/xxx.php " . $strjoin . "  >/dev/null & ";2  // $a=exec($cmd, $out, $returndata);3  4  5  $command = "/usr/bin/php ".STATISTIC_EXPORT_SCRPRocess = proc_open($command, array(),$pipes); 7  $var = proc_get_status($process); 8  proc_close($process);9  $pid = intval($var['pid'])+1;

而在create_excel方法中:

需填寫以下代碼:

1 set_time_limit(0); //取消腳本運行時間的超時上限2 3 ignore_user_abort(TRUE); //后臺運行,不受用戶關閉瀏覽器的影響

調用相關的api得到數據:

1 $statistic = call_user_func(array('shellscript','get_result'),$url,$params);2 if(!is_object($statistic) || !isset($statistic->data->items)){3     usleep(400000);//停止400毫秒4     $statistic = call_user_func(array('shellscript','get_result'),$url,$params);5 }
四、顯示文件生成進度

但是怎么顯示相應的文件生成進度呢,怎么知道文件到底生成好了沒有呢?

這里,我用到的方法是,在寫入數據文件的時候data.xsl,每個數據文件都生成一個對應的文件進度文件,暫且稱為flag_data.xsl;

思路:

  1. 第一次請求api的時候,根據返回的total總數,以及pagesize,確定要請求的次數count;
  2. 這樣便可知道要請求api的次數(分頁請求api),在寫入數據文件的同時,同時寫入進度文件flag_data.xsl; 數據格式大約是(以逗號分割) 1,5 2,5 ...
  3. 然后顯示文件進度的時候,讀取進度文件,這樣變可知道數據文件大體的進度
  4. 前端js處理時,幾秒讀取一次相應的方法(如果都100%進度,可停止請求方法),從而實現動態查看文件的生成進度

查看文件的進度方法:

 1     public function execscript_process(){ 2         $this->load->library('smarty'); 3         $file_arr_str = array(); 4         $file_arr_process = array(); 5         $file_arr_name = array(); 6         $file_arr = array(); 7         $refresh_flag = 'yes'; 8         $uid = $_REQUEST['uid']; 9         $url_dir = STATISTIC_EXPORT_FILE_DIR.$uid .'/';//@todo10         if(!is_dir($url_dir)){11             @mkdir($url_dir,0777);12         }13         $files = scandir($url_dir);14 15         if(!empty($files)){16             foreach ($files as $key => $value) {17                 if($value!='.' && $value!='..'){18                     if(substr($value, 0 , 5)=="flag_"){19                         $file_size = filesize($url_dir . $value);20                         if(!empty($file_size)){21                             $fhandle = fopen($url_dir . $value, 'rb+');22                             fseek($fhandle, -1, SEEK_END);23                             $fstr = '';24                             while(($c = fgetc($fhandle)) !== false) {25                               if($c == "/n" && $fstr) break;26                               $fstr = $c . $fstr;27                               fseek($fhandle, -2, SEEK_CUR);28                             }29                             fclose($fhandle);30                             $fstr = trim($fstr);31                             $fstr_arr_str = explode(',', $fstr);32                             $file_arr_process[] = 100 * number_format($fstr_arr_str[0]/$fstr_arr_str[1],2).'%';33                             $file_arr_name[] = substr($value,5);34                          }35                     }36                 }37             }38             39             foreach ($file_arr_process as $key => $value) {40                 if($value != '100%'){41                     $refresh_flag = 'no';42                     break;43                 }44             }45         }46 47         $file_arr = array(48             'process' => $file_arr_process,49             'name' => $file_arr_name,50             'refresh_flag' => $refresh_flag51             );52         $file_arr_json = json_encode($file_arr);53         echo $file_arr_json;54     }
View Code五、下載文件

文件的下載就好說了,既然已經都生成成功,下載的方法如下:

 1     public function execscript_download(){ 2         $filename = $_REQUEST['filename']; 3         $uid = $_REQUEST['uid']; 4         $file_dir = STATISTIC_EXPORT_FILE_DIR.$uid.'/'.$filename; 5         if (!file_exists($file_dir)){ 6             header("Content-type: text/html; charset=utf-8"); 7             echo "File not found!"; 8             exit;  9         } else {10             ini_set("memory_limit","500M"); 11             header('Content-Description: File Transfer');12             header('Content-Type: application/octet-stream');13             header('Content-Disposition: attachment; filename='.basename($file_dir));14             header('Content-Transfer-Encoding: binary');15             header('Expires: ' . gmdate('D, d M Y H:i:s') . ' GMT');16             header('Cache-Control: must-revalidate,post-check=0, pre-check=0');17             header('Pragma: public');18             header('Content-Length: ' . filesize($file_dir));19             readfile($file_dir);20         }21 22     }
六、上線后出現的問題

本地本來已經測試完畢,可上線后,卻出現了奇怪的問題;

現象描述:

當在后臺點擊生成文件,跳轉到下載頁的時候,因為下載頁是顯示文件進度的頁面, 竟然出現有時候有剛剛點擊的文件進度,有時候沒有,就感覺沒有生成相應的文件一樣;

解決方法:

因為數據文件和進度文件都是生成在程序的某個文件夾file中,所以讀取的時候都是讀取的文件夾下的文件,從而判斷顯示進度;

后面才知道,由于后臺程序有兩臺服務器,導致讀取以及下載的時候找不到相應的文件夾,兩個服務

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 安徽省| 鲜城| 余庆县| 吉木乃县| 寿宁县| 霍邱县| 彭泽县| 封丘县| 泊头市| 南汇区| 南充市| 怀化市| 六枝特区| 阳新县| 蒲江县| 武邑县| 卓尼县| 聂拉木县| 松原市| 辰溪县| 武穴市| 中宁县| 旬邑县| 塔河县| 阜康市| 元谋县| 沂水县| 习水县| 五家渠市| 通山县| 红河县| 镇原县| 闽侯县| 全椒县| 新津县| 灵山县| 昭通市| 交城县| 卫辉市| 呼伦贝尔市| 临江市|