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 无限分类的树类代码
Dec 03 PHP
PHP中删除变量时unset()和null的区别分析
Jan 27 PHP
PHP字符编码问题之GB2312 VS UTF-8解决方法
Jun 23 PHP
分享一下贝贝成长进度的php代码
Sep 14 PHP
php数组查找函数in_array()、array_search()、array_key_exists()使用实例
Apr 29 PHP
自定义session存储机制避免会话保持问题
Oct 08 PHP
Laravel 5框架学习之子视图和表单复用
Apr 09 PHP
一个完整的PHP类包含的七种语法说明
Jun 04 PHP
PHP统计当前在线用户数实例讲解
Oct 21 PHP
php图片上传类 附调用方法
May 15 PHP
php实现文件管理与基础功能操作
Mar 21 PHP
Laravel框架Auth用户认证操作实例分析
Sep 29 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预定义常量
2006/12/25 PHP
简单的过滤字符串中的HTML标记
2006/12/25 PHP
PHP+Ajax实现无刷新分页实例详解(附demo源码下载)
2016/04/07 PHP
功能强大的PHP POST提交数据类
2016/07/15 PHP
php连接微软MSSQL(sql server)完全攻略
2016/11/27 PHP
jquery 学习之二 属性 文本与值(text,val)
2010/11/25 Javascript
js常用排序实现代码
2010/12/28 Javascript
javascript阻止scroll事件多次执行的思路及实现
2013/11/08 Javascript
jQuery显示和隐藏 常用的状态判断方法
2015/01/29 Javascript
详细分析JavaScript变量类型
2015/07/08 Javascript
jQuery带时间的日期控件代码分享
2015/08/26 Javascript
AngularJS+Node.js实现在线聊天室
2015/08/28 Javascript
js html css实现复选框全选与反选
2016/10/09 Javascript
vue2.0中goods选购栏滚动算法的实现代码
2017/05/17 Javascript
详解Angular Reactive Form 表单验证
2017/07/06 Javascript
vue webpack打包优化操作技巧
2018/02/22 Javascript
Vue Router去掉url中默认的锚点#
2018/08/01 Javascript
JavaScript遍历数组的三种方法map、forEach与filter实例详解
2019/02/27 Javascript
js实现全选反选不选功能代码详解
2019/04/24 Javascript
vue中的v-if和v-show的区别详解
2019/09/01 Javascript
es6函数之尾调用优化实例分析
2020/04/25 Javascript
js实现时间日期校验
2020/05/26 Javascript
原生js实现自定义滚动条组件
2021/01/20 Javascript
python模拟登陆Tom邮箱示例分享
2014/01/13 Python
使用IPython来操作Docker容器的入门指引
2015/04/08 Python
Python2.x和3.x下maketrans与translate函数使用上的不同
2015/04/13 Python
Python实现拷贝多个文件到同一目录的方法
2016/09/19 Python
Pycharm学习教程(5) Python快捷键相关设置
2017/05/03 Python
Python中模块(Module)和包(Package)的区别详解
2019/08/07 Python
澳大利亚儿童和婴儿产品在线商店:Lime Tree Kids
2017/10/05 全球购物
酒店司机岗位职责
2013/12/14 职场文书
大学生学雷锋活动总结
2014/06/26 职场文书
机械专业求职信范文
2014/07/15 职场文书
社会工作专业自荐信
2014/09/26 职场文书
带你彻底理解JavaScript中的原型对象
2021/04/14 Javascript
mysql中整数数据类型tinyint详解
2021/12/06 MySQL