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 相关文章推荐
一个程序下载的管理程序(一)
Oct 09 PHP
PHP命名空间(Namespace)的使用详解
May 04 PHP
Windows中使用计划任务自动执行PHP程序实例
May 09 PHP
ThinkPHP采用实现三级循环代码实例
Jul 18 PHP
ThinkPHP控制器间实现相互调用的方法
Oct 31 PHP
php使用pdo连接报错Connection failed SQLSTATE的解决方法
Dec 15 PHP
php打印一个边长为N的实心和空心菱型的方法
Mar 02 PHP
php中使用gd库实现下载网页中所有图片
May 12 PHP
php动态绑定变量的用法
Jun 16 PHP
Joomla实现组件中弹出一个模式(modal)窗口的方法
May 04 PHP
如何通过View::first使用Laravel Blade的动态模板详解
Sep 21 PHP
PHP设计模式之装饰器模式实例详解
Feb 07 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
在IIS上安装PHP4.0正式版
2006/10/09 PHP
PHP动态创建Web站点的方法
2011/08/14 PHP
thinkPHP5框架实现基于ajax的分页功能示例
2018/06/12 PHP
thinkphp框架类库扩展操作示例
2019/11/26 PHP
禁止JQuery中的load方法装载IE缓存中文件的方法
2009/09/11 Javascript
jQuery 验证插件 Web前端设计模式(asp.net)
2010/10/17 Javascript
jQuery登陆判断简单实现代码
2013/04/21 Javascript
js获取IP地址的方法小结
2014/07/01 Javascript
javascript 动态创建表格的2种方法总结
2015/03/04 Javascript
JS实现控制表格行文本对齐的方法
2015/03/30 Javascript
你不知道的高性能JAVASCRIPT
2016/01/18 Javascript
js控制按钮,防止频繁点击响应的实例
2017/02/15 Javascript
js判断PC端与移动端跳转
2020/12/24 Javascript
JavaScript正则表达式和级联效果
2017/09/14 Javascript
Vue2.0 slot分发内容与props验证的方法
2017/12/12 Javascript
浅谈Node.js爬虫之网页请求模块
2018/01/11 Javascript
js事件on动态绑定数据,绑定多个事件的方法
2018/09/15 Javascript
浅谈在不使用ssr的情况下解决Vue单页面SEO问题(2)
2018/11/08 Javascript
vue ajax 拦截原理与实现方法示例
2019/11/29 Javascript
js获取本日、本周、本月的时间代码
2020/02/01 Javascript
浅谈插入排序算法在Python程序中的实现及简单改进
2016/05/04 Python
一文带你了解Python中的字符串是什么
2018/11/20 Python
python linecache 处理固定格式文本数据的方法
2019/01/08 Python
python opencv 批量改变图片的尺寸大小的方法
2019/06/28 Python
python 实现保存最新的三份文件,其余的都删掉
2019/12/22 Python
PyTorch中topk函数的用法详解
2020/01/02 Python
基于keras 模型、结构、权重保存的实现
2020/01/24 Python
如何解决tensorflow恢复模型的特定值时出错
2020/02/06 Python
使用TFRecord存取多个数据案例
2020/02/17 Python
Pycharm快捷键配置详细整理
2020/10/13 Python
应聘医药销售自荐书范文
2014/02/08 职场文书
12.4法制宣传日标语
2014/10/08 职场文书
物业前台接待岗位职责
2015/04/03 职场文书
2015年七七事变78周年纪念活动方案
2015/05/06 职场文书
2015年村级财务管理制度
2015/08/04 职场文书
Java实战之用Swing实现通讯录管理系统
2021/06/13 Java/Android