PHPExcel内存泄漏问题解决方法


Posted in PHP onJanuary 23, 2015

使用 PHPExcel 来生成 excel 文档是比较消耗内存的,有时候可能会需要通过一个循环来把大数据切分成若干个小的 excel 文档保存来避免内存耗尽。
然而 PHPExcel 存在 circular references 的情况(貌似在最新的 1.6.5 版本中仍然没有去解决这个问题),如果在一次 http 请求过程中反复多次构建 PHPExcel 及 PHPExcel_Writer_Excel5 对象实例来完成多个 excel 文档生成操作的话,所有被构建的对象实例都无法在 http 请求结束之前及时释放,从而造成内存泄漏。
解决办法是在 PHPExcel_Worksheet 类中增加方法:

 public function Destroy() {

     foreach($this->_cellCollection as $index => $dummy) {

         $this->_cellCollection[$index] = null;

     }

 }

并在 PHPExcel 类中增加方法:
 public function Destroy() {

     foreach($this->_workSheetCollection as $index => $dummy) {

         $this->_workSheetCollection[$index]->Destroy();

         $this->_workSheetCollection[$index] = null;

     }

 }

然后在需要资源回收的地方显式的调用 PHPExcel::Destroy() 来处理循环引用的问题。注意 __destruct() 方法是在对象被认为可以被释放的时候才会被调用,所以循环引用的处理不能放到 __destruct() 来进行。
PHP 相关文章推荐
PHP编码规范的深入探讨
Jun 06 PHP
ThinkPHP之getField详解
Jun 20 PHP
php实现专业获取网站SEO信息类实例
Apr 02 PHP
PHP网站建设的流程与步骤分享
Sep 25 PHP
java模拟PHP的pack和unpack类
Apr 13 PHP
PHP页面间传递值和保持值的方法
Aug 24 PHP
yii2-GridView在开发中常用的功能及技巧总结
Jan 07 PHP
PHP Socket网络操作类定义与用法示例
Aug 30 PHP
PHP对称加密算法(DES/AES)类的实现代码
Nov 14 PHP
关于 Laravel Redis 多个进程同时取队列问题详解
Dec 25 PHP
PHP+JS实现的实时搜索提示功能
Mar 13 PHP
关于PHP虚拟主机概念及如何选择稳定的PHP虚拟主机
Nov 20 PHP
使用PHP生成PDF方法详解
Jan 23 #PHP
C# WinForm中实现快捷键自定义设置实例
Jan 23 #PHP
对PHP PDO的一些认识小结
Jan 23 #PHP
smarty模板引擎中自定义函数的方法
Jan 22 #PHP
smarty模板引擎中内建函数if、elseif和else的使用方法
Jan 22 #PHP
smarty模板引擎使用内建函数foreach循环取出所有数组值的方法
Jan 22 #PHP
smarty模板引擎从配置文件中获取数据的方法
Jan 22 #PHP
You might like
Yii+upload实现AJAX上传图片的方法
2016/07/13 PHP
php 函数使用可变数量的参数方法
2017/05/02 PHP
Js之软键盘实现(js源码)
2007/01/30 Javascript
JavaScript中常用的六种互动方法示例
2015/03/13 Javascript
jquery专业的导航菜单特效代码分享
2015/08/29 Javascript
smartcrop.js智能图片裁剪库
2015/10/14 Javascript
XML、HTML、CSS与JS的区别整理
2016/02/18 Javascript
jQuery实现控制文字内容溢出用省略号(…)表示的方法
2016/02/26 Javascript
jquery实现全选功能效果的实现代码
2016/05/05 Javascript
JS JSOP跨域请求实例详解
2016/07/04 Javascript
Angular懒加载机制刷新后无法回退的快速解决方法
2016/08/30 Javascript
canvas学习之API整理笔记(一)
2016/12/29 Javascript
原生JS 购物车及购物页面的cookie使用方法
2017/08/21 Javascript
详解微信小程序调起键盘性能优化
2018/07/24 Javascript
深入了解JavaScript 防抖和节流
2019/09/12 Javascript
[10:24]郎朗助力完美“圣”典,天籁交织奏响序曲
2016/12/18 DOTA
Python全局变量操作详解
2015/04/14 Python
Python 利用内置set函数对字符串和列表进行去重的方法
2018/06/29 Python
python 处理数字,把大于上限的数字置零实现方法
2019/01/28 Python
Python 利用切片从列表中取出一部分使用的方法
2019/02/01 Python
深入浅析python3中的unicode和bytes问题
2019/07/03 Python
Python利用matplotlib绘制约数个数统计图示例
2019/11/26 Python
Python cookie的保存与读取、SSL讲解
2020/02/17 Python
Python IDLE或shell中切换路径的操作
2020/03/09 Python
纯DOM+CSS3实现简单的小风车动画
2016/09/27 HTML / CSS
简单的JAVA编程面试题
2013/03/19 面试题
土木工程应届生自荐信
2013/09/24 职场文书
造型师求职自荐信
2013/09/27 职场文书
班主任新年寄语
2014/04/04 职场文书
《小动物过冬》教学反思
2014/04/17 职场文书
《沙漠中的绿洲》教学反思
2014/04/24 职场文书
乐观自信演讲稿范文
2014/05/21 职场文书
mybatis中sql语句CDATA标签的用法说明
2021/06/30 Java/Android
SQL实现LeetCode(196.删除重复邮箱)
2021/08/07 MySQL
深入理解go slice结构
2021/09/15 Golang
Python 使用 Frame tkraise() 方法在 Tkinter 应用程序中的Frame之间切换
2022/04/24 Python