一、PHP迭代生成器
1.PHP性能优化利器:迭代生成器 yield理解
很多PHP开发者或许都不知道生成器这个功能,可能是因为生成器是PHP 5.5.0才引入的功能,也可以是生成器作用不是很明显。但是,生成器功能的确非常有用。
2.迭代生成器的优点
直接讲概念估计你听完还是一头雾水,所以我们先来说说优点,也许能勾起你的兴趣。那么迭代生成器有哪些优点,如下:
- 生成器会对PHP应用的性能有非常大的影响
- PHP代码运行时节省大量的内存
- 比较适合计算大量的数据
二、快速生成百万条测试数据
这里推荐数据库的蠕虫复制命令
先建好表后,插2条测试数据后,执行几次下列命令,即可指数增长
INSERT INTO user (username,phone,city) SELECT username,phone,city FROM user;
三、实战一(100w数据导出1个csv文件,在浏览器下载)
1.解决数据查询内存溢出
了解完生成器yield原理之后,我们还需要解决一个问题,我们常用的mysql查询函数是mysqli_query(connection,query,resultmode);,通常都是直接填写第一第二个参数就直接查询,但该函数默认的是对全部结果集进行缓存,这会导致数据过多的时候,内存也会溢出。因此,我们需要设置第三个参数为MYSQLI_USE_RESULT来逐行读取结果集。那或许您有疑问为什么不直接 遍历该mysqli_query()方法返回的结果来当每一行数据写到CSV中,而还要用yield来存储一次每行数据再写到CSV中呢?其实这是因为mysqli_query()返回的结果是mysqli_result Object形式,而fputcsv()这个方法要求第二个参数为数组。所以yield的作用就是中转站,但是他是一行行运输数据,而不是读多行来运输数据。
1 | php复制代码<?php |
四、实战二(100w数据导出多个csv文件,在文件夹中保存)
1 | php复制代码<?php |
五、总结
- 浏览器只能同时下载一个文件,循环导出,浏览器最后智能下载最后一个文件
- 导出的数据到csv能打开查看的只到100w行,如果超过100w行,进行导出多个csv文件
本文转载自: 掘金