如何导出带有数字格式的100Klogging的HTML表格,而不会耗尽内存

我正在使用PHPMySQL将数据提取到HTML表格。 数据应该在Excel文件中下载HTML 。 以下代码被使用:

 $filename = "individual_list_" . date('Ymdhms') . ".xls"; header("Content-type: application/vnd.ms-excel"); header("Content-Disposition: attachment; filename=\"$filename\""); $html='<style>.num {mso-number-format:General;}.text{mso-number-format:"\@";}</style><table border=1>'; $rowCount=1; foreach ($export_data as $key => $row) { if(!$header) { $header_field=array_keys($row); $html .='<thead><tr>'; foreach ($header_field as $k => $value) { $html .='<th class="text">'.$value.'</th>'; } $html .='</tr></head>'; $header=true; } $values=array_values($row); $rowCount++; $html .='<tbody><tr>'; foreach ($values as $k => $value) { if (DateTime::createFromFormat('Ymd G:i:s', $value) !== FALSE) { $value = date('Ym-d', strtotime($value)); } $html .='<td class="text">'.$value.'</td>'; } $html .='</tr></tbody>'; } $html .='</table>'; echo $html; 

有大约90Klogging出口。 此代码曾经产生Allowed Memory Exhausted错误,所以我改变了内存限制。 现在错误已解决,但数据显示为HTML Table而不是下载。 该代码适用于较less的logging集。 如何解决这个问题? 导出(下载)在下载Excel文件的popup窗口中完成。 下载完成后,popup窗口如何closures?

输出循环内的html,而不是缓冲直到结束。 这将减lessPHP所需的内存量,并可能加速下载过程。 PHP和您的Web服务器仍然会做一些缓冲。 这是好的,但你可以重写显式flush(); 如果问题依然存在的话。

 $filename = "individual_list_" . date('Ymdhms') . ".xls"; header("Content-type: application/vnd.ms-excel"); header("Content-Disposition: attachment; filename=\"$filename\""); echo '<style>.num {mso-number-format:General;}.text{mso-number-format:"\@";}</style><table border=1>'; $rowCount=1; foreach ($export_data as $key => $row) { $html = ''; if(!$header) { $header_field=array_keys($row); $html .='<thead><tr>'; foreach ($header_field as $k => $value) { $html .='<th class="text">'.$value.'</th>'; } $html .='</tr></head>'; $header=true; } $values=array_values($row); $rowCount++; $html .='<tbody><tr>'; foreach ($values as $k => $value) { if (DateTime::createFromFormat('Ymd G:i:s', $value) !== FALSE) { $value = date('Ym-d', strtotime($value)); } $html .='<td class="text">'.$value.'</td>'; echo $html; } echo '</tr></tbody>'; echo '</table>'; } 

根据您的MySQL客户端库,您也可以使用无缓冲的MySQL查询,这些查询允许您的脚本在从MySQL接收到数据后立即开始生成HTML,并且使用的内存less于等待整个结果加载到PHP缓冲区。