phpQuery占用内存过多的处理方法


Posted in PHP onNovember 13, 2013

phpQuery是一个用php实现的类似jQuery的开源项目,可以在服务器端以jQuery的语法形式解析网页元素。 相对于正则或其它方式匹配网页方式,phpQuery使用起来要方便的多。
在使用phpQuery采集网页时,遇到一个问题:在处理大量网页之后,phpQuery占用的内存数量非常惊人(很快就超过了1G),
比如这段代码:

while (true) {
    phpQuery::newDocumentFile($htmlFile);
    // 处理网页元素...
    echo memory_get_usage() . "\n";
}

谨慎运行上面这段代码,它会很快用光你的内存。
经过查看phpQuery的源代码终于发现了问题所在,phpQuery在每处理一个网页就会产生一个DOMDocumentWrapper 对象,而每个DOMDocumentWrapper 对象会被保存在静态成员$documents中(phpQuery::createDocumentWrapper中),这个变量是一个数组,每解析一个网页数组元素就增加一个。
phpQuery::$documents[$wrapper->id] = $wrapper;
找到问题后,解决就很容易了,每次解析完一个网页,把phpQuery::$documents置空即可。
while (true) {
    phpQuery::newDocumentFile($htmlFile);
    // 处理网页元素...
    phpQuery::$documents = array();
    echo memory_get_usage() . "\n";
}

内存占用稳定了。
PHP 相关文章推荐
用PHP写的MySQL数据库用户认证系统代码
Mar 22 PHP
php下过滤HTML代码的函数
Dec 10 PHP
phpmyadmin 常用选项设置详解版
Mar 07 PHP
php递归实现无限分类生成下拉列表的函数
Aug 08 PHP
PHP的SQL注入过程分析
Jan 06 PHP
解析使用ThinkPHP应该掌握的调试手段
Jun 20 PHP
什么是PEAR?什么是PECL?PHP中两个容易混淆的概念解释
Jul 01 PHP
解决php的“It is not safe to rely on the system’s timezone settings”问题
Oct 08 PHP
浅谈php(codeigniter)安全性注意事项
Apr 06 PHP
php数据结构之顺序链表与链式线性表示例
Jan 22 PHP
Laravel 自定命令以及生成文件的例子
Oct 23 PHP
discuz论坛更换域名,详细文件修改步骤
Dec 09 PHP
PHP反射类ReflectionClass和ReflectionObject的使用方法
Nov 13 #PHP
php堆排序(heapsort)练习
Nov 13 #PHP
php生成EAN_13标准条形码实例
Nov 13 #PHP
使用php计算排列组合的方法
Nov 13 #PHP
测试php函数的方法
Nov 13 #PHP
PHP中判断变量为空的几种方法小结
Nov 12 #PHP
php不允许用户提交空表单(php空值判断)
Nov 12 #PHP
You might like
PHP 日期加减的类,很不错
2009/10/10 PHP
php中通过curl模拟登陆discuz论坛的实现代码
2012/02/16 PHP
用PHP将Unicode 转化为UTF-8的实现方法(推荐)
2017/02/08 PHP
Ajax+PHP实现的模拟进度条功能示例
2019/02/11 PHP
JQuery 引发两次$(document.ready)事件
2010/01/15 Javascript
利用js实现遮罩以及弹出可移动登录窗口
2013/07/08 Javascript
javascript制作坦克大战全纪录(1)
2014/11/27 Javascript
简介AngularJS的HTML DOM支持情况
2015/06/17 Javascript
javascript常用的方法整理
2015/08/20 Javascript
AngularJS实现单独作用域内的数据操作
2016/09/05 Javascript
js实现前端分页页码管理
2017/01/06 Javascript
js实现简易垂直滚动条
2017/02/22 Javascript
Vue异步加载about组件
2017/10/31 Javascript
javascript字体颜色控件的开发 JS实现字体控制
2017/11/27 Javascript
HTML5+JS+JQuery+ECharts实现异步加载问题
2017/12/16 jQuery
Vue组件通信的四种方式汇总
2018/02/08 Javascript
微信小程序五子棋游戏的棋盘,重置,对弈实现方法【附demo源码下载】
2019/02/20 Javascript
浅谈Javascript中的对象和继承
2019/04/19 Javascript
angular 服务随记小结
2019/05/06 Javascript
VueJS 取得 URL 参数值的方法
2019/07/19 Javascript
解决element-ui里的下拉多选框 el-select 时,默认值不可删除问题
2020/08/14 Javascript
openlayers 3实现车辆轨迹回放
2020/09/24 Javascript
vue集成一个支持图片缩放拖拽的富文本编辑器
2021/01/29 Vue.js
梅尔倒谱系数(MFCC)实现
2019/06/19 Python
使用tqdm显示Python代码执行进度功能
2019/12/08 Python
Pytorch自己加载单通道图片用作数据集训练的实例
2020/01/18 Python
Python 实现微信自动回复的方法
2020/09/11 Python
Numpy实现卷积神经网络(CNN)的示例
2020/10/09 Python
python上下文管理的使用场景实例讲解
2021/03/03 Python
在线购买澳大利亚设计师手拿包和奢华晚装手袋:Olga Berg
2019/03/20 全球购物
美国滑板店:Tactics
2020/11/08 全球购物
物业管理求职自荐信
2013/09/25 职场文书
党员承诺书范文
2014/05/19 职场文书
2014年派出所工作总结
2014/11/21 职场文书
英文商务邀请函范文
2015/01/31 职场文书
2019年员工晋升管理制度范本!
2019/07/08 职场文书