相信很多人做大批量数据导出和数据导入的时候,经常会遇到PHP内存溢出的问题,在解决了问题之后,总结了一些经验,整理成文章记录下。
优化点
- 优化SQL语句,避免慢查询,合理的建立索引,查询指定的字段,sql优化这块在此就不展开了。
- 查询的结果集为大对象时转数组处理,框架中一般有方法可以转,如Laravel中有toArray(),Yii2中有asArray()。
- 对于大数组进行数据切割处理,PHP函数有array_chunk()、array_slice()。
- 对于大型的字符串和对象,使用引用传递&。
- 用过的变量及时unset。
- 导出的文件格式由excel改为csv
- ini_set('memory_limit',''),设置程序可以使用的内存(不建议这样做)。
思考
内存管理
PHP的内存什么怎么管理的呢?
在学C语言时,开发者是需要手动管理内存。在PHP中,Zend引擎提供为了处理请求相关数据提供了一种特殊的内存管理器。请求相关数据是只需要服务单个请求,最迟会在请求结束时释放数据。
防止内存泄漏并尽可能快地释放所有内存是内存管理的重要组成部分。因为安全原因,Zend引擎会释放所有上面提到的API锁分配的内存。