当前位置:首页 > PHP教程 > php高级应用 > 列表

PHP快速导出百万级数据到CSV或者EXCEL文件

发布:smiling 来源: PHP粉丝网  添加日期:2022-04-02 09:58:12 浏览: 评论:0 

前言: 很多时候,因为数据统计,我们需要将数据库的数据导出到Excel等文件中,以供数据人员进行查看,如果数据集不大,其实很容易;但是如果对于大数集的导出,将要考虑各种性能的问题,这里以导出数据库一百万条数据为例,导出时间不过20秒,值的学习的一种大数据导出方式。

一、导出思路

需要考虑服务器内存

需要考虑程序运行的最大时间

缺少BOM头导致乱码的处理

如果导出数量过大,推荐使用循环导出,每次循环这里以导出一万条为例,循环100次即可全部导出

二、导出源码

下面源码将数据库信息修改成自己的即可使用

亲测导出一百万条数据,3个字段,不过20秒

如果服务器硬件不支持一次读取一万条数据,可将循环次数提高,导出数量降低

  1. <?php 
  2.   //让程序一直运行 
  3.   set_time_limit(0); 
  4.   //设置程序运行内存 
  5.   ini_set('memory_limit''128M'); 
  6.    
  7.   $fileName = '测试导出数据'
  8.   header('Content-Encoding: UTF-8'); 
  9.   header("Content-type:application/vnd.ms-excel;charset=UTF-8"); 
  10.   header('Content-Disposition: attachment;filename="' . $fileName . '.csv"'); 
  11.     
  12.   //打开php标准输出流 
  13.   $fp = fopen('php://output''a'); 
  14.    
  15.   //添加BOM头,以UTF8编码导出CSV文件,如果文件头未添加BOM头,打开会出现乱码。 
  16.   fwrite($fpchr(0xEF).chr(0xBB).chr(0xBF)); 
  17.   //添加导出标题 
  18.   fputcsv($fp, ['姓名''年龄''地区']); 
  19.     
  20.   //链接数据库 
  21.   $dsn = "mysql:host=127.0.0.1;port=3306;dbname=db_www;charset=utf8"
  22.   $pdo = new PDO($dsn'root'''); 
  23.    
  24.   $step = 100; //循环次数 
  25.   $nums = 10000; //每次导出数量 
  26.    
  27.   for($i = 0; $i < $step$i++) { 
  28.     $start = $i * 10000; 
  29.     $sql = "SELECT uname,age,city FROM `hd_test` ORDER BY `id` LIMIT {$start},{$nums}"
  30.     $pdostatement = $pdo->query($sql); 
  31.     $result = $pdostatement->fetchAll(PDO::FETCH_ASSOC); 
  32.     foreach ($result as $item) { 
  33.       fputcsv($fp$item); 
  34.     } 
  35.     //每1万条数据就刷新缓冲区 
  36.     ob_flush(); 
  37.     flush(); 
  38.   }  

三、快速生成百万条测试数据

这里推荐数据库的蠕虫复制命令

先建好表后,插2条测试数据后,执行几次下列命令,即可指数增长

INSERT INTO hd_test (uname,age,city) SELECT uname,age,city FROM hd_test;

Tags: PHP导出百万级数据

分享到: