如题! 要求是及时的,不能事先生成。得有效率呀,各位各抒己见!3q
<?phpset_time_limit(0);header('Content-Encoding: gzip');header('Content-type: application/gz');header('Content-Disposition: attachment; filename=test.csv.gz');//header('Content-Length: 1024'); // 这里根据实际情况修改,不加时在下载时不显示总文件大小,但要注意导出内容大小与这里设置要一致,也是经过gzip压缩后的大小for ($i = 0; $i < 100; $i++) {$content = gzencode(str_repeat($i, 100000) . "n");echo $content;ob_flush();flush();}
又加入了 gzip 压缩,速度会更快一些
我之前做过这个,首先是 把脚本运行时间设置0set_time_limit(0);ignore_user_abort(0);
接着就开始分段检索数据记录 ,比如原始sql是 select * from tt
此处就要计划好分片规则,首先计算出总行数,假设是 100w,比如 每次取 500条,那么 要循环的次数就是 100w/500
然后对每次进行分批处理,
此处给出一个辅助类
// 数据导出组件final class SimpleDataExport {
static function generateResponseHeader($filename,$charset='UTF-8',$mimeType = 'application/octet-stream'){header("Pragma: public"); header("Expires: 0");header("Cache-Control: must-revalidate, post-check=0, pre-check=0");header("Content-Type: application/force-download");header("Content-Type: {$mimeType}; charset={$charset}");header("Content-Transfer-Encoding: binary");header(Core_AppUtils::getContentDispositionHeader($_SERVER["HTTP_USER_AGENT"],$filename,'attachment',$charset));}
}/*** 简易 cvs 数据导出类**/class SimpleCvsExport {
static function generateXlsHeader($filename){SimpleDataExport::generateResponseHeader($filename,'utf-8','text/csv');echo(chr(0xEF).chr(0xBB).chr(0xBF));}
static function writeRow(array $row){echo implode(',',$row) . PHP_EOL;}}
各位大能求帮。!球棒啊!
CSV文件就是个文本文件,而且是按行来写的。所以你只要将查询的结果集不断写出去,再批量的flush,客户端就会源源不断的接收到这个文件。
就跟正常写的text或者word文件一样吧。 将结果集一行行写完?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
暂无简介
文章 0 评论 0
接受
发布评论
评论(5)
<?php
set_time_limit(0);
header('Content-Encoding: gzip');
header('Content-type: application/gz');
header('Content-Disposition: attachment; filename=test.csv.gz');
//header('Content-Length: 1024'); // 这里根据实际情况修改,不加时在下载时不显示总文件大小,但要注意导出内容大小与这里设置要一致,也是经过gzip压缩后的大小
for ($i = 0; $i < 100; $i++) {
$content = gzencode(str_repeat($i, 100000) . "n");
echo $content;
ob_flush();
flush();
}
又加入了 gzip 压缩,速度会更快一些
我之前做过这个,首先是 把脚本运行时间设置0
set_time_limit(0);
ignore_user_abort(0);
接着就开始分段检索数据记录 ,比如原始sql是 select * from tt
此处就要计划好分片规则,首先计算出总行数,假设是 100w,比如 每次取 500条,那么 要循环的次数就是 100w/500
然后对每次进行分批处理,
此处给出一个辅助类
// 数据导出组件
final class SimpleDataExport {
static function generateResponseHeader($filename,$charset='UTF-8',$mimeType = 'application/octet-stream'){
header("Pragma: public"); header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Content-Type: application/force-download");
header("Content-Type: {$mimeType}; charset={$charset}");
header("Content-Transfer-Encoding: binary");
header(Core_AppUtils::getContentDispositionHeader($_SERVER["HTTP_USER_AGENT"],$filename,'attachment',$charset));
}
}
/**
* 简易 cvs 数据导出类
*
*/
class SimpleCvsExport {
static function generateXlsHeader($filename){
SimpleDataExport::generateResponseHeader($filename,'utf-8','text/csv');
echo(chr(0xEF).chr(0xBB).chr(0xBF));
}
static function writeRow(array $row){
echo implode(',',$row) . PHP_EOL;
}
}
各位大能求帮。!球棒啊!
CSV文件就是个文本文件,而且是按行来写的。所以你只要将查询的结果集不断写出去,再批量的flush,客户端就会源源不断的接收到这个文件。
就跟正常写的text或者word文件一样吧。 将结果集一行行写完?