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调用三种数据库的方法(2)
Oct 09 PHP
《PHP边学边教》(02.Apache+PHP环境配置――上篇)
Dec 13 PHP
php 分库分表hash算法
Nov 12 PHP
php中CI操作多个数据库的代码
Jul 05 PHP
三个类概括PHP的五种设计模式
Sep 05 PHP
PHP 读取Postgresql中的数组
Apr 14 PHP
PHP 自定义错误处理函数的使用详解
May 10 PHP
ThinkPHP中I(),U(),$this->post()等函数用法
Nov 22 PHP
PHP基于socket实现客户端和服务端通讯功能
Jul 13 PHP
php判断电子邮件是否正确方法
Dec 04 PHP
ThinkPHP框架整合微信支付之Native 扫码支付模式一图文详解
Apr 09 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
用Php实现链结人气统计
2006/10/09 PHP
CodeIgniter php mvc框架 中国网站
2008/05/26 PHP
PHP里的中文变量说明
2011/07/23 PHP
php中用加号与用array_merge合并数组的区别深入分析
2013/06/03 PHP
zf框架的校验器使用使用示例(自定义校验器和校验器链)
2014/03/13 PHP
开启PHP Static 关键字之旅模式
2015/11/13 PHP
PHP基于递归实现的约瑟夫环算法示例
2017/08/27 PHP
javascript URL编码和解码使用说明
2010/04/12 Javascript
网络之美 JavaScript中Get和Set访问器的实现代码
2010/09/19 Javascript
关于Javascript模块化和命名空间管理的问题说明
2010/12/06 Javascript
javascript学习笔记(十五) js间歇调用和超时调用
2012/06/20 Javascript
javascript抖动元素的小例子
2013/10/28 Javascript
JavaScript中读取和保存文件实例
2014/05/08 Javascript
js delete 用法(删除对象属性及变量)
2014/08/24 Javascript
基于javascript、ajax、memcache和PHP实现的简易在线聊天室
2015/02/03 Javascript
js实现的牛顿摆效果
2015/03/31 Javascript
通过实例理解javascript中没有函数重载的概念
2015/06/03 Javascript
全面理解JavaScript中的闭包
2016/05/12 Javascript
Bootstrap笔记—折叠实例代码
2017/03/13 Javascript
Node批量爬取头条视频并保存方法
2018/09/20 Javascript
微信小程序拍照和摄像功能实现方法示例
2019/02/01 Javascript
微信小程序封装分享与分销功能过程解析
2019/08/13 Javascript
javascript实现倒计时效果
2020/02/17 Javascript
让你30分钟快速掌握vue3教程
2020/10/26 Javascript
微信跳一跳自动运行python脚本
2018/01/08 Python
Python如何抓取天猫商品详细信息及交易记录
2018/02/23 Python
python-str,list,set间的转换实例
2018/06/27 Python
Python3查找列表中重复元素的个数的3种方法详解
2020/02/13 Python
解决在keras中使用model.save()函数保存模型失败的问题
2020/05/21 Python
逼真的HTML5树叶飘落动画
2016/03/01 HTML / CSS
有趣的睡衣和礼物:LazyOne
2019/11/27 全球购物
协议书格式
2014/04/23 职场文书
教师党员群众路线教育实践活动心得体会
2014/11/04 职场文书
2015年房地产销售工作总结
2015/04/20 职场文书
《月光曲》教学反思
2016/02/16 职场文书
安装Windows Server 2012 R2企业版操作系统并设置好相关参数
2022/04/29 Servers