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 curl_setopt()函数实例代码与参数分析
Jun 02 PHP
解析php获取字符串的编码格式的方法(函数)
Jun 21 PHP
解析PHP对现有搜索引擎的调用
Jun 25 PHP
PHP中单引号与双引号的区别分析
Aug 19 PHP
php设计模式之单例模式实例分析
Feb 25 PHP
浅谈PHP接收POST数据方式
Jun 05 PHP
PHP微信红包API接口
Dec 05 PHP
php简单实现短网址(短链)还原的方法(测试可用)
May 09 PHP
php中preg_replace_callback函数简单用法示例
Jul 21 PHP
总结PHP删除字符串最后一个字符的三种方法
Aug 30 PHP
一个简单安全的PHP验证码类、PHP验证码
Sep 24 PHP
PHP新特性之字节码缓存和内置服务器
Aug 11 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框架在页面输出执行sql语句以方便调试的实现方法
2014/12/24 PHP
Yii实现的多级联动下拉菜单
2016/07/13 PHP
phpQuery采集网页实现代码实例
2020/04/02 PHP
JavaScript中的对象化编程
2008/01/16 Javascript
利用javascript/jquery对上传文件格式过滤的方法
2009/07/25 Javascript
jquery动态加载图片数据练习代码
2011/08/04 Javascript
jQuery EasyUI API 中文文档 - ValidateBox验证框
2011/10/06 Javascript
Prototype源码浅析 String部分(三)之HTML字符串处理
2012/01/15 Javascript
Jquery的hover方法让鼠标经过li时背景变色
2013/09/06 Javascript
验证码在IE中不刷新而谷歌等浏览器正常的解决方案
2014/03/18 Javascript
详解JavaScript中的forEach()方法的使用
2015/06/08 Javascript
javascript连续赋值问题
2015/07/08 Javascript
js剪切板应用clipboardData实例解析
2016/05/29 Javascript
jQuery焦点图轮播插件KinSlideshow用法分析
2016/06/08 Javascript
js将滚动条滚动到指定位置的简单实现方法
2016/06/25 Javascript
js实现点击按钮弹出上传文件的窗口
2016/12/23 Javascript
react-router4 嵌套路由的使用方法
2017/07/24 Javascript
在JS循环中使用async/await的方法
2018/10/12 Javascript
Vue开发Html5微信公众号的步骤
2019/04/11 Javascript
微信小程序实现电子签名功能
2020/07/29 Javascript
Openlayers实现测量功能
2020/09/25 Javascript
[03:58]兄弟们,回来开黑了!DOTA2昔日战友招募宣传视频
2016/07/17 DOTA
Python内建模块struct实例详解
2018/02/02 Python
使用python中的in ,not in来检查元素是不是在列表中的方法
2018/07/06 Python
详解Python 字符串相似性的几种度量方法
2019/08/29 Python
Java Spring项目国际化(i18n)详细方法与实例
2020/03/20 Python
夜大毕业自我鉴定
2013/10/11 职场文书
革命英雄事迹演讲稿
2014/09/13 职场文书
检察院院长群众路线教育实践活动个人整改措施
2014/10/04 职场文书
第二批党的群众路线教育实践活动个人整改方案
2014/10/31 职场文书
2014年环境卫生工作总结
2014/11/24 职场文书
入党积极分子党支部意见
2015/06/02 职场文书
被委托人身份证明
2015/08/07 职场文书
详解MySQL连接挂死的原因
2021/05/18 MySQL
Java由浅入深通关抽象类与接口(上篇)
2022/04/26 Java/Android
python高温预警数据获取实例
2022/07/23 Python