php 实现百万级数据导出这里应用了服务器的缓存来实现
实现:
一:建设测试表,并退出测试数据
1:创立测试表
这里我建了一个 test 表,字段别离为:id,name,age,email
2:退出测试数据
(1) 首先手动向表中增加若干行数据
而后执行如下命令批量增加数据
INSERT INTO test (name,age,email) SELECT name,age,email FROM test;
屡次执行下面的命令测试数据会呈指数减少,这样就能够失去很多测试数据
二:php 实现导出百万级数据 (这里我的查问命令应用的时 Yii 框架自带的查问命令)
// 让程序始终运行
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"');
// 关上 php 规范输入流
$fp = fopen('php://output', 'a');
// 增加 BOM 头,以 UTF8 编码导出 CSV 文件,如果文件头未增加 BOM 头,关上会呈现乱码。fwrite($fp, chr(0xEF).chr(0xBB).chr(0xBF));
// 增加导出题目
fputcsv($fp, ['姓名', '岁数', '邮箱']);
$nums = 10000; // 每次导出数量
$count = Test::find()->count();
$step = ceil($count/$nums);// 循环次数
for($i = 0; $i < $step; $i++) {$result = Test::find()
->select(['name', 'age', 'email'])
->limit($nums)
->offset($i * $nums)
->asArray()
->all();
foreach ($result as $item) {fputcsv($fp, $item);
}
// 每 1 万条数据就刷新缓冲区
ob_flush();
flush();}
exit;
如上测试后能够发现导出一百万左右数据只需十几秒左右工夫,效率还算是不错的
参考:https://blog.csdn.net/weixin_…