问答一下,轻松解决,电脑应用解决专家!
主板显卡CPU内存显示器
硬盘维修显卡维修显示器维修
注册表系统命令DOS命令Win8
存储光存储鼠标键盘
内存维修打印机维修
WinXPWin7Win10/Win11
硬件综合机箱电源散热器手机数码
主板维修CPU维修键盘鼠标维修
Word教程Excel教程PowerPointWPS
网络工具系统工具图像工具
数据库javascriptLinux系统
PHP教程CSS教程XML教程

php导出百万级数据csv,刷新缓存区

更新时间:2022-06-12 14:35 作者:佚名点击:

1.背景

将大量数据百万级导出到csv。由于数据量大,仅扩大内存仍会报错。

百万级的数据从数据库中查询,若不分段查或不刷新缓冲区,均会出错

2.方案

分段从数据库中查询再定期刷新缓冲区的方法。

set_time_limit(0);//让程序一直运行
ini_set('memory_limit', '128M');//设置临时内存

$fileName = '测试导出数据';//导出文件名
header('Content-Encoding: UTF-8');
header("Content-type:application/vnd.ms-excel;charset=UTF-8");
header('Content-Disposition: attachment;filename="' . $fileName . '.csv"');
$fp = fopen('php://output', 'a');
fwrite($fp, chr(0xEF).chr(0xBB).chr(0xBF));//bom防乱码
fputcsv($fp, ['title1', 'title2', 'title3']);//表头

require_once '../class/db.class.php';
$obj=new db();
$sqlBefore="select id from setting_item where 1 ";
$count=$obj->getNumRow($sqlBefore);
$nums=10000;//每次导出数量
$step=ceil($count/$nums);//循环次数
for($i = 0; $i < $step; $i++) {
  $start = $i * 10000;
  $sql=str_replace("id", "*", $sqlBefore)." LIMIT {$start},{$nums}";
  //echo $sql;
  $q=$obj->getAll3($sql);
  while($item=$q->fetch_array(MYSQLI_USE_RESULT)){
  //print_r($item);
    fputcsv($fp, $item);
  }
  //每1万条数据就刷新缓冲区
  ob_flush();
  flush();
}//for

3.结论

13万条数据,导出时间7s。

顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
你可能感兴趣的内容