私が体験した大容量ファイルデータエクスポート(バックグラウンド実行、自動生成)
1. はじめに
バックグラウンドで実行された Excel 形式エクスポートの統計情報を記録します。 before 最近同僚に関数について質問されましたが、具体的な内容をしばらく忘れていたので記録しました; 関数、通常、クリックすると、ファイルが生成され、自動的にダウンロードされます。
データ量が少ない場合は、リクエストを一度に完了してローカルにダウンロードできます。
ただし、データ量が特に多い場合は、ページをダウンロードする必要があります。 Excel への書き込みが成功するまで待ちます。
これは、バックグラウンド ユーザーが他のページを操作する能力に影響します。このため、次の関数は Excel エクスポート用に最適化されています。 >
Excel エクスポートは Excel ファイルの生成と Excel ファイルのダウンロードの 2 つの部分に分かれています
- Excel ファイルの生成が実行されますフロントエンドは待機する必要がなく、他のバックグラウンド操作を実行できます
- 生成された Excel ファイルの進行状況を表示するダウンロード ファイル ページを追加します (完了後にのみ)。生成された Excel ファイルをダウンロードできますか
- ファイルが生成されたら、[ダウンロード] をクリックして対応するファイルをダウンロードします
- 2. Excel ファイルを生成します
Excel ファイルを生成するにはさまざまな方法がありますが、ここでは 1 つずつ記録しません。
ここでは表の HTML 形式と、対応する Excel ステートメントが使用されています (他のメソッドは office07 で開くと文字化けするようだったとうろ覚えです。ファイルはまだ文字化けしているため、後で CSV 形式を使用しようとします)
ファイルの先頭:


<span style="font-family: 'Microsoft YaHei';"><span style="color: #008080;"> 1</span> <span style="color: #800080;">$struserdata</span> = Eof</span><span style="color: #008080;"> 2</span> 3 xmlns:x="urn:schemas-microsoft-com:office:excel"<span style="color: #008080;"> 4</span> xmlns="http://www.w3.org/TR/REC-html40"><span style="color: #008080;"> 5</span> <span style="color: #008080;"> 6</span> span style="color: #0000ff;">PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><span style="color: #008080;"> 7</span> <span style="color: #008080;"> 8</span> <span style="color: #008080;"> 9</span> <meta http-equiv="Content-type" content="text/html;charset=utf-8"><span style="color: #008080;">10</span> <style id="Classeur1_16681_Styles"><span style="color: #008080;">11 </style><span style="color: #008080;">12</span> <span style="color: #008080;">13</span> <span style="color: #008080;">14</span> <div id="Classeur1_16681" align="center" x:publishsource="Excel"> <span style="color: #008080;">15</span> <span style="color: #008080;">16</span> <table x:str border="1" cellpadding="0" cellspacing="0" width="100%" style="border-collapse: collapse"> <span style="color: #008080;">17</span> Eof; ファイルの終わり: <span class="cnblogs_code_collapse" style="font-family: 'Microsoft YaHei';"></span> <p><span style="font-family: 'Microsoft YaHei';"></span></p> <div class="cnblogs_code" onclick="cnblogs_code_show('6e7814c6-7ec0-4037-94c2-b0b68682b66d')"> <span style="font-family: 'Microsoft YaHei';"><img class="code_img_closed lazy" src="/static/imghwm/default1.png" data-src="/img/2015/08/11/12404618.gif" id="code_img_closed_6e7814c6-7ec0-4037-94c2-b0b68682b66d" alt="">コードの表示<img class="code_img_opened lazy" src="/static/imghwm/default1.png" data-src="/img/2015/08/11/12404619.gif" id="code_img_opened_6e7814c6-7ec0-4037-94c2-b0b68682b66d" style="max-width:90%" onclick="cnblogs_code_hide('6e7814c6-7ec0-4037-94c2-b0b68682b66d',event)" alt=""></span><div id="cnblogs_code_open_6e7814c6-7ec0-4037-94c2-b0b68682b66d" class="cnblogs_code_hide"><pre class="brush:php;toolbar:false"><span style="font-family: 'Microsoft YaHei';"><span style="color: #008080;">1</span> <span style="color: #800080;">$struserdata</span> = Eof</span><span style="color: #008080;">2</span>
シナリオ:
ユーザーが Excel を生成した後、ダウンロード ページに移動します。ユーザーは生成が完了するまで待つ必要がなく、を実行できます。ダウンロード ページでは、ファイル生成の進行状況とダウンロード可能ステータスかどうかを確認できます。
アイデア:
クリックして Excel を生成し、ダウンロード ページを表示します - --> show_download メソッド
生成excel ---> create_excel 方法
show_download方法中调用 create_excel方法,而show_download 方法中,自己用了一下命令行执行程序的方式,
利用php命令行的方式,把参数传递给 create_excel方法
<span style="font-family: 'Microsoft YaHei';"><span style="color: #008080;">1</span> <span style="color: #008000;">//</span><span style="color: #008000;"> $cmd = "/usr/bin/php /home/xxx/xxx.php " . $strjoin . " >/dev/null & ";</span><span style="color: #008080;">2</span> <span style="color: #008000;"> // $a=exec($cmd, $out, $returndata);</span><span style="color: #008080;">3</span> <span style="color: #008080;">4</span> <span style="color: #008080;">5</span> <span style="color: #800080;">$command</span> = "/usr/bin/php ".STATISTIC_EXPORT_SCRIPT_DIR."xxx.php " . "'" .<span style="color: #800080;">$strjoin</span> ."'". " " . <span style="color: #800080;">$uid</span> . " ". <span style="color: #800080;">$action</span> ." & "<span style="color: #000000;">;</span><span style="color: #008080;">6</span> <span style="color: #800080;">$process</span> = <span style="color: #008080;">proc_open</span>(<span style="color: #800080;">$command</span>, <span style="color: #0000ff;">array</span>(),<span style="color: #800080;">$pipes</span><span style="color: #000000;">); </span><span style="color: #008080;">7</span> <span style="color: #800080;">$var</span> = <span style="color: #008080;">proc_get_status</span>(<span style="color: #800080;">$process</span><span style="color: #000000;">); </span><span style="color: #008080;">8</span> <span style="color: #008080;">proc_close</span>(<span style="color: #800080;">$process</span><span style="color: #000000;">);</span><span style="color: #008080;">9</span> <span style="color: #800080;">$pid</span> = <span style="color: #008080;">intval</span>(<span style="color: #800080;">$var</span>['pid'])+1;</span>
而在create_excel方法中:
需填写以下代码:
<span style="font-family: 'Microsoft YaHei';"><span style="color: #008080;">1</span> <span style="color: #008080;">set_time_limit</span>(0); <span style="color: #008000;">//</span><span style="color: #008000;">取消脚本运行时间的超时上限</span><span style="color: #008080;">2</span> <span style="color: #008080;">3</span> <span style="color: #008080;">ignore_user_abort</span>(<span style="color: #0000ff;">TRUE</span>); <span style="color: #008000;">//</span><span style="color: #008000;">后台运行,不受用户关闭浏览器的影响</span></span>
调用相关的api得到数据:
<span style="font-family: 'Microsoft YaHei';"><span style="color: #008080;">1</span> <span style="color: #800080;">$statistic</span> = <span style="color: #008080;">call_user_func</span>(<span style="color: #0000ff;">array</span>('shellscript','get_result'),<span style="color: #800080;">$url</span>,<span style="color: #800080;">$params</span><span style="color: #000000;">);</span><span style="color: #008080;">2</span> <span style="color: #0000ff;">if</span>(!<span style="color: #008080;">is_object</span>(<span style="color: #800080;">$statistic</span>) || !<span style="color: #0000ff;">isset</span>(<span style="color: #800080;">$statistic</span>->data-><span style="color: #000000;">items)){</span><span style="color: #008080;">3</span> <span style="color: #008080;">usleep</span>(400000);<span style="color: #008000;">//</span><span style="color: #008000;">停止400毫秒</span><span style="color: #008080;">4</span> <span style="color: #800080;">$statistic</span> = <span style="color: #008080;">call_user_func</span>(<span style="color: #0000ff;">array</span>('shellscript','get_result'),<span style="color: #800080;">$url</span>,<span style="color: #800080;">$params</span><span style="color: #000000;">);</span><span style="color: #008080;">5</span> }</span>
四、显示文件生成进度
但是怎么显示相应的文件生成进度呢,怎么知道文件到底生成好了没有呢?
这里,我用到的方法是,在写入数据文件的时候data.xsl,每个数据文件都生成一个对应的文件进度文件,暂且称为flag_data.xsl;
思路:
- 第一次请求api的时候,根据返回的total总数,以及pagesize,确定要请求的次数count;
- 这样便可知道要请求api的次数(分页请求api),在写入数据文件的同时,同时写入进度文件flag_data.xsl;
数据格式大约是(以逗号分割)
1,5
2,5
...- 然后显示文件进度的时候,读取进度文件,这样变可知道数据文件大体的进度
- 前端js处理时,几秒读取一次相应的方法(如果都100%进度,可停止请求方法),从而实现动态查看文件的生成进度
查看文件的进度方法:


<span style="font-family: 'Microsoft YaHei';"><span style="color: #008080;"> 1</span> <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> execscript_process(){</span><span style="color: #008080;"> 2</span> <span style="color: #800080;">$this</span>->load->library('smarty'<span style="color: #000000;">);</span><span style="color: #008080;"> 3</span> <span style="color: #800080;">$file_arr_str</span> = <span style="color: #0000ff;">array</span><span style="color: #000000;">();</span><span style="color: #008080;"> 4</span> <span style="color: #800080;">$file_arr_process</span> = <span style="color: #0000ff;">array</span><span style="color: #000000;">();</span><span style="color: #008080;"> 5</span> <span style="color: #800080;">$file_arr_name</span> = <span style="color: #0000ff;">array</span><span style="color: #000000;">();</span><span style="color: #008080;"> 6</span> <span style="color: #800080;">$file_arr</span> = <span style="color: #0000ff;">array</span><span style="color: #000000;">();</span><span style="color: #008080;"> 7</span> <span style="color: #800080;">$refresh_flag</span> = 'yes'<span style="color: #000000;">;</span><span style="color: #008080;"> 8</span> <span style="color: #800080;">$uid</span> = <span style="color: #800080;">$_REQUEST</span>['uid'<span style="color: #000000;">];</span><span style="color: #008080;"> 9</span> <span style="color: #800080;">$url_dir</span> = STATISTIC_EXPORT_FILE_DIR.<span style="color: #800080;">$uid</span> .'/';<span style="color: #008000;">//</span><span style="color: #008000;">@todo</span><span style="color: #008080;">10</span> <span style="color: #0000ff;">if</span>(!<span style="color: #008080;">is_dir</span>(<span style="color: #800080;">$url_dir</span><span style="color: #000000;">)){</span><span style="color: #008080;">11</span> @<span style="color: #008080;">mkdir</span>(<span style="color: #800080;">$url_dir</span>,0777<span style="color: #000000;">);</span><span style="color: #008080;">12</span> <span style="color: #000000;"> }</span><span style="color: #008080;">13</span> <span style="color: #800080;">$files</span> = <span style="color: #008080;">scandir</span>(<span style="color: #800080;">$url_dir</span><span style="color: #000000;">);</span><span style="color: #008080;">14</span> <span style="color: #008080;">15</span> <span style="color: #0000ff;">if</span>(!<span style="color: #0000ff;">empty</span>(<span style="color: #800080;">$files</span><span style="color: #000000;">)){</span><span style="color: #008080;">16</span> <span style="color: #0000ff;">foreach</span> (<span style="color: #800080;">$files</span> <span style="color: #0000ff;">as</span> <span style="color: #800080;">$key</span> => <span style="color: #800080;">$value</span><span style="color: #000000;">) {</span><span style="color: #008080;">17</span> <span style="color: #0000ff;">if</span>(<span style="color: #800080;">$value</span>!='.' && <span style="color: #800080;">$value</span>!='..'<span style="color: #000000;">){</span><span style="color: #008080;">18</span> <span style="color: #0000ff;">if</span>(<span style="color: #008080;">substr</span>(<span style="color: #800080;">$value</span>, 0 , 5)=="flag_"<span style="color: #000000;">){</span><span style="color: #008080;">19</span> <span style="color: #800080;">$file_size</span> = <span style="color: #008080;">filesize</span>(<span style="color: #800080;">$url_dir</span> . <span style="color: #800080;">$value</span><span style="color: #000000;">);</span><span style="color: #008080;">20</span> <span style="color: #0000ff;">if</span>(!<span style="color: #0000ff;">empty</span>(<span style="color: #800080;">$file_size</span><span style="color: #000000;">)){</span><span style="color: #008080;">21</span> <span style="color: #800080;">$fhandle</span> = <span style="color: #008080;">fopen</span>(<span style="color: #800080;">$url_dir</span> . <span style="color: #800080;">$value</span>, 'rb+'<span style="color: #000000;">);</span><span style="color: #008080;">22</span> <span style="color: #008080;">fseek</span>(<span style="color: #800080;">$fhandle</span>, -1,<span style="color: #000000;"> SEEK_END);</span><span style="color: #008080;">23</span> <span style="color: #800080;">$fstr</span> = ''<span style="color: #000000;">;</span><span style="color: #008080;">24</span> <span style="color: #0000ff;">while</span>((<span style="color: #800080;">$c</span> = <span style="color: #008080;">fgetc</span>(<span style="color: #800080;">$fhandle</span>)) !== <span style="color: #0000ff;">false</span><span style="color: #000000;">) {</span><span style="color: #008080;">25</span> <span style="color: #0000ff;">if</span>(<span style="color: #800080;">$c</span> == "\n" && <span style="color: #800080;">$fstr</span>) <span style="color: #0000ff;">break</span><span style="color: #000000;">;</span><span style="color: #008080;">26</span> <span style="color: #800080;">$fstr</span> = <span style="color: #800080;">$c</span> . <span style="color: #800080;">$fstr</span><span style="color: #000000;">;</span><span style="color: #008080;">27</span> <span style="color: #008080;">fseek</span>(<span style="color: #800080;">$fhandle</span>, -2,<span style="color: #000000;"> SEEK_CUR);</span><span style="color: #008080;">28</span> <span style="color: #000000;"> }</span><span style="color: #008080;">29</span> <span style="color: #008080;">fclose</span>(<span style="color: #800080;">$fhandle</span><span style="color: #000000;">);</span><span style="color: #008080;">30</span> <span style="color: #800080;">$fstr</span> = <span style="color: #008080;">trim</span>(<span style="color: #800080;">$fstr</span><span style="color: #000000;">);</span><span style="color: #008080;">31</span> <span style="color: #800080;">$fstr_arr_str</span> = <span style="color: #008080;">explode</span>(',', <span style="color: #800080;">$fstr</span><span style="color: #000000;">);</span><span style="color: #008080;">32</span> <span style="color: #800080;">$file_arr_process</span>[] = 100 * <span style="color: #008080;">number_format</span>(<span style="color: #800080;">$fstr_arr_str</span>[0]/<span style="color: #800080;">$fstr_arr_str</span>[1],2).'%'<span style="color: #000000;">;</span><span style="color: #008080;">33</span> <span style="color: #800080;">$file_arr_name</span>[] = <span style="color: #008080;">substr</span>(<span style="color: #800080;">$value</span>,5<span style="color: #000000;">);</span><span style="color: #008080;">34</span> <span style="color: #000000;"> }</span><span style="color: #008080;">35</span> <span style="color: #000000;"> }</span><span style="color: #008080;">36</span> <span style="color: #000000;"> }</span><span style="color: #008080;">37</span> <span style="color: #000000;"> }</span><span style="color: #008080;">38</span> <span style="color: #008080;">39</span> <span style="color: #0000ff;">foreach</span> (<span style="color: #800080;">$file_arr_process</span> <span style="color: #0000ff;">as</span> <span style="color: #800080;">$key</span> => <span style="color: #800080;">$value</span><span style="color: #000000;">) {</span><span style="color: #008080;">40</span> <span style="color: #0000ff;">if</span>(<span style="color: #800080;">$value</span> != '100%'<span style="color: #000000;">){</span><span style="color: #008080;">41</span> <span style="color: #800080;">$refresh_flag</span> = 'no'<span style="color: #000000;">;</span><span style="color: #008080;">42</span> <span style="color: #0000ff;">break</span><span style="color: #000000;">;</span><span style="color: #008080;">43</span> <span style="color: #000000;"> }</span><span style="color: #008080;">44</span> <span style="color: #000000;"> }</span><span style="color: #008080;">45</span> <span style="color: #000000;"> }</span><span style="color: #008080;">46</span> <span style="color: #008080;">47</span> <span style="color: #800080;">$file_arr</span> = <span style="color: #0000ff;">array</span><span style="color: #000000;">(</span><span style="color: #008080;">48</span> 'process' => <span style="color: #800080;">$file_arr_process</span>,<span style="color: #008080;">49</span> 'name' => <span style="color: #800080;">$file_arr_name</span>,<span style="color: #008080;">50</span> 'refresh_flag' => <span style="color: #800080;">$refresh_flag</span><span style="color: #008080;">51</span> <span style="color: #000000;"> );</span><span style="color: #008080;">52</span> <span style="color: #800080;">$file_arr_json</span> = json_encode(<span style="color: #800080;">$file_arr</span><span style="color: #000000;">);</span><span style="color: #008080;">53</span> <span style="color: #0000ff;">echo</span> <span style="color: #800080;">$file_arr_json</span><span style="color: #000000;">;</span><span style="color: #008080;">54</span> }</span>View Code
五、下载文件
文件的下载就好说了,既然已经都生成成功,下载的方法如下:
<span style="font-family: 'Microsoft YaHei';"><span style="color: #008080;"> 1</span> <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> execscript_download(){</span><span style="color: #008080;"> 2</span> <span style="color: #800080;">$filename</span> = <span style="color: #800080;">$_REQUEST</span>['filename'<span style="color: #000000;">];</span><span style="color: #008080;"> 3</span> <span style="color: #800080;">$uid</span> = <span style="color: #800080;">$_REQUEST</span>['uid'<span style="color: #000000;">];</span><span style="color: #008080;"> 4</span> <span style="color: #800080;">$file_dir</span> = STATISTIC_EXPORT_FILE_DIR.<span style="color: #800080;">$uid</span>.'/'.<span style="color: #800080;">$filename</span><span style="color: #000000;">;</span><span style="color: #008080;"> 5</span> <span style="color: #0000ff;">if</span> (!<span style="color: #008080;">file_exists</span>(<span style="color: #800080;">$file_dir</span><span style="color: #000000;">)){</span><span style="color: #008080;"> 6</span> <span style="color: #008080;">header</span>("Content-type: text/html; charset=utf-8"<span style="color: #000000;">);</span><span style="color: #008080;"> 7</span> <span style="color: #0000ff;">echo</span> "File not found!"<span style="color: #000000;">;</span><span style="color: #008080;"> 8</span> <span style="color: #0000ff;">exit</span><span style="color: #000000;">; </span><span style="color: #008080;"> 9</span> } <span style="color: #0000ff;">else</span><span style="color: #000000;"> {</span><span style="color: #008080;">10</span> <span style="color: #008080;">ini_set</span>("memory_limit","500M"<span style="color: #000000;">); </span><span style="color: #008080;">11</span> <span style="color: #008080;">header</span>('Content-Description: File Transfer'<span style="color: #000000;">);</span><span style="color: #008080;">12</span> <span style="color: #008080;">header</span>('Content-Type: application/octet-stream'<span style="color: #000000;">);</span><span style="color: #008080;">13</span> <span style="color: #008080;">header</span>('Content-Disposition: attachment; filename='.<span style="color: #008080;">basename</span>(<span style="color: #800080;">$file_dir</span><span style="color: #000000;">));</span><span style="color: #008080;">14</span> <span style="color: #008080;">header</span>('Content-Transfer-Encoding: binary'<span style="color: #000000;">);</span><span style="color: #008080;">15</span> <span style="color: #008080;">header</span>('Expires: ' . <span style="color: #008080;">gmdate</span>('D, d M Y H:i:s') . ' GMT'<span style="color: #000000;">);</span><span style="color: #008080;">16</span> <span style="color: #008080;">header</span>('Cache-Control: must-revalidate,post-check=0, pre-check=0'<span style="color: #000000;">);</span><span style="color: #008080;">17</span> <span style="color: #008080;">header</span>('Pragma: public'<span style="color: #000000;">);</span><span style="color: #008080;">18</span> <span style="color: #008080;">header</span>('Content-Length: ' . <span style="color: #008080;">filesize</span>(<span style="color: #800080;">$file_dir</span><span style="color: #000000;">));</span><span style="color: #008080;">19</span> <span style="color: #008080;">readfile</span>(<span style="color: #800080;">$file_dir</span><span style="color: #000000;">);</span><span style="color: #008080;">20</span> <span style="color: #000000;"> }</span><span style="color: #008080;">21</span> <span style="color: #008080;">22</span> }</span>
六、上线后出现的问题
本地本来已经测试完毕,可上线后,却出现了奇怪的问题;
现象描述:
当在后台点击生成文件,跳转到下载页的时候,因为下载页是显示文件进度的页面,
竟然出现有时候有刚刚点击的文件进度,有时候没有,就感觉没有生成相应的文件一样;解决方法:
因为数据文件和进度文件都是生成在程序的某个文件夹file中,所以读取的时候都是读取的文件夹下的文件,从而判断显示进度;
后面才知道,由于后台程序有两台服务器,导致读取以及下载的时候找不到相应的文件夹,两个服务器相应的文件夹弄个共享目录就可以了
七、相应的后续优化
由于下载的文件多了,导致文件夹下的文件越来越多,而原来生成的文件是没有价值的,所以加了个定期删除文件的功能,只保留近七天的文件
当然可以用crontab,只不过我比较懒,是在点击生成文件的时候,判断了一下文件夹中的过期文件,从而删除
<span style="font-family: 'Microsoft YaHei';"><span style="color: #008080;"> 1</span> <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> execscript_process_show(){</span><span style="color: #008080;"> 2</span> <span style="color: #800080;">$this</span>->load->library('smarty'<span style="color: #000000;">);</span><span style="color: #008080;"> 3</span> <span style="color: #800080;">$uid</span> = <span style="color: #800080;">$_REQUEST</span>['uid'<span style="color: #000000;">];</span><span style="color: #008080;"> 4</span> <span style="color: #800080;">$url_dir</span> = STATISTIC_EXPORT_FILE_DIR.<span style="color: #800080;">$uid</span> .'/';<span style="color: #008000;">//</span><span style="color: #008000;">@todo</span><span style="color: #008080;"> 5</span> <span style="color: #0000ff;">if</span>(!<span style="color: #008080;">is_dir</span>(<span style="color: #800080;">$url_dir</span><span style="color: #000000;">)){</span><span style="color: #008080;"> 6</span> @<span style="color: #008080;">mkdir</span>(<span style="color: #800080;">$url_dir</span>,0777<span style="color: #000000;">);</span><span style="color: #008080;"> 7</span> <span style="color: #000000;"> } </span><span style="color: #008080;"> 8</span> <span style="color: #800080;">$files</span> = <span style="color: #008080;">scandir</span>(<span style="color: #800080;">$url_dir</span><span style="color: #000000;">);</span><span style="color: #008080;"> 9</span> <span style="color: #0000ff;">if</span>(!<span style="color: #0000ff;">empty</span>(<span style="color: #800080;">$files</span><span style="color: #000000;">)){</span><span style="color: #008080;">10</span> <span style="color: #0000ff;">foreach</span> (<span style="color: #800080;">$files</span> <span style="color: #0000ff;">as</span> <span style="color: #800080;">$key</span> => <span style="color: #800080;">$value</span><span style="color: #000000;">) {</span><span style="color: #008080;">11</span> <span style="color: #0000ff;">if</span>(<span style="color: #800080;">$value</span>!='.' && <span style="color: #800080;">$value</span>!='..'<span style="color: #000000;">){</span><span style="color: #008080;">12</span> <span style="color: #0000ff;">foreach</span> (<span style="color: #800080;">$files</span> <span style="color: #0000ff;">as</span> <span style="color: #800080;">$key</span> => <span style="color: #800080;">$value</span><span style="color: #000000;">) {</span><span style="color: #008080;">13</span> <span style="color: #0000ff;">if</span>(<span style="color: #800080;">$value</span>!='.' && <span style="color: #800080;">$value</span>!='..'<span style="color: #000000;">){</span><span style="color: #008080;">14</span> <span style="color: #0000ff;">if</span>(<span style="color: #008080;">substr</span>(<span style="color: #800080;">$value</span>, 0 , 5)!="flag_"<span style="color: #000000;">){</span><span style="color: #008080;">15</span> <span style="color: #800080;">$filenamedate</span> = <span style="color: #008080;">substr</span>(<span style="color: #800080;">$value</span>, 0,10<span style="color: #000000;">);</span><span style="color: #008080;">16</span> <span style="color: #800080;">$today</span> = <span style="color: #008080;">date</span>('Y-m-d',<span style="color: #008080;">time</span><span style="color: #000000;">());</span><span style="color: #008080;">17</span> <span style="color: #800080;">$filenamedate</span> = <span style="color: #008080;">date</span>('Y-m-d',<span style="color: #008080;">strtotime</span>(<span style="color: #800080;">$filenamedate</span>)+(STATISTIC_FILE_EXPIRE_DAY-1)*24*3600<span style="color: #000000;">);</span><span style="color: #008080;">18</span> <span style="color: #0000ff;">if</span>(<span style="color: #800080;">$today</span>><span style="color: #800080;">$filenamedate</span>){<span style="color: #008000;">//</span><span style="color: #008000;">文件过期</span><span style="color: #008080;">19</span> @<span style="color: #008080;">unlink</span>(<span style="color: #800080;">$url_dir</span> . <span style="color: #800080;">$value</span><span style="color: #000000;">);</span><span style="color: #008080;">20</span> @<span style="color: #008080;">unlink</span>(<span style="color: #800080;">$url_dir</span> . 'flag_' . <span style="color: #800080;">$value</span><span style="color: #000000;">);</span><span style="color: #008080;">21</span> <span style="color: #000000;"> }</span><span style="color: #008080;">22</span> <span style="color: #000000;"> }</span><span style="color: #008080;">23</span> <span style="color: #000000;"> }</span><span style="color: #008080;">24</span> <span style="color: #000000;"> } </span><span style="color: #008080;">25</span> <span style="color: #000000;"> }</span><span style="color: #008080;">26</span> <span style="color: #000000;"> }</span><span style="color: #008080;">27</span> <span style="color: #000000;"> }</span><span style="color: #008080;">28</span> <span style="color: #008080;">29</span> <span style="color: #800080;">$this</span>->smarty->assign('uid',<span style="color: #800080;">$uid</span><span style="color: #000000;">);</span><span style="color: #008080;">30</span> <span style="color: #800080;">$this</span>->smarty->display('interact/statistic/execscript.tpl'<span style="color: #000000;">);</span><span style="color: #008080;">31</span> }</span>
八、后记
大文件的导出大体就是这个样子,欢迎大家吐槽,共同交流;
当时在用命令行执行方法的时候,也参考了一下相应的资料,记录一下;
<span style="color: #000000; font-family: 'Microsoft YaHei';">http://blog.csdn.net/yysdsyl/article/details/4636457http://www.codesky.net/article/201202/163385.htmlhttp://www.cnblogs.com/zdz8207/p/3765567.htmlhttp:[email protected]/blog/static/4112219320097300922992/http://php.net/manual/en/features.commandline.phphttp://blog.csdn.net/yangjun07167/article/details/5603425http://blog.csdn.net/yunsongice/article/details/5445448http://www.cppblog.com/amazon/archive/2011/12/01/161281.aspxhttp://blog.51yip.com/tag/proc_openhttp://www.justwinit.cn/post/1418/http://limboy.me/tech/2010/12/05/php-async.html</span>
- 4楼Shannon
- 我目前在用的导出Excel使用了MS的Excel, 需要配置DCOM.,先导出XML格式,再将XML格式转换为Excel格式, 超过50000行自动换页,,在IIS中设置允许最大800M的下载, 导出几年的交易记录毫无压力.,Excel文件超过4M,自动使用7Z压缩.,,使用VBScript, 可以在Windows平台直接运行.
- Re: 糖糖果
- @Shannon,厉害!如果文件特别大的话,确实应该考虑文件下载的大小限制以及文件的压缩,,也确实是下一步优化的思路,学习了。。。
- 3楼zjeagle
- 个人认为大文件还用table的html格式,那叫耍流氓。,文件不是一般的大。
- Re: longware
- @zjeagle,csv伺候,小一半
- Re: 糖糖果
- @zjeagle,哈哈...这个确实了,还是那个office07打开的问题记得,所以最终还是用了table,不过用table确实不是很好的办法
- 2楼zjeagle
- csv还是太大了。,建议考虑标准的excel格式,用aspose.cells或者npoi之类吧。
- Re: 糖糖果
- @zjeagle,确实,有些生成的excel的工具,格式都生成的好,并且也很漂亮,满足的格式也多。。。
- 1楼zsea
- 曾经也遇到过大量数据导出Excel,还不许用csv,最后是自己写的导出的功能,一次能导出好几十万条记录到Excel,速度还可以。
- Re: 糖糖果
- @zsea,哈哈,我也遇到过,有些需求实在是变态,本来能很容易的实现,却不让用。。。

この記事では、PHPでインターフェイスを作成、実装、および使用する方法について説明し、コード組織と保守性の利点に焦点を当てています。

この記事では、PHPのCrypt()とpassword_hash()の違いについて、パスワードハッシュの違いについて説明し、最新のWebアプリケーションの実装、セキュリティ、および適合性に焦点を当てています。

記事では、入力検証、出力エンコード、およびOWASP ESAPIやHTML浄化器などのツールを使用して、PHPのクロスサイトスクリプト(XSS)を防止します。

PHPでのオートローディングは、必要に応じてクラスファイルを自動的にロードし、メモリの使用を削減し、コード組織を強化することでパフォーマンスを向上させます。ベストプラクティスには、PSR-4の使用とコードを効果的に整理することが含まれます。

PHPストリームは、一貫したAPIを介したファイル、ネットワークソケット、圧縮形式などのリソースの処理を統合し、複雑さを抽象化し、コードの柔軟性と効率を高めます。

この記事では、PHPでファイルアップロードサイズの管理を管理し、2MBのデフォルト制限とPHP.ini設定を変更してそれを増やす方法に焦点を当てています。

この記事では、PHP 7.1で導入されたPHPのヌル可能なタイプについて説明し、変数またはパラメーターが指定されたタイプまたはnullのいずれかを可能にします。読みやすさの改善、タイプの安全性、明示的な意図などの利点を強調し、宣言する方法を説明します

この記事では、プログラミングのunset()とlink()関数の違いについて説明し、目的とユースケースに焦点を当てています。 unset()はメモリから変数を削除しますが、link()はファイルシステムからファイルを削除します。どちらもEFFECにとって重要です


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

Safe Exam Browser
Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。

EditPlus 中国語クラック版
サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

SublimeText3 Linux 新バージョン
SublimeText3 Linux 最新バージョン

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

PhpStorm Mac バージョン
最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

ホットトピック









