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 相关文章推荐
Windows中安装Apache2和PHP4权威指南
Nov 18 PHP
php数据结构与算法(PHP描述) 查找与二分法查找
Jun 21 PHP
基于php 随机数的深入理解
Jun 05 PHP
解决FastCGI 进程超过了配置的活动超时时限的问题
Jul 03 PHP
PHP调用Linux命令权限不足问题解决方法
Feb 07 PHP
php递归遍历删除文件的方法
Apr 17 PHP
PHP中的魔术方法总结和使用实例
May 11 PHP
PHP会话控制实例分析
Dec 24 PHP
PHP+jQuery实现滚屏无刷新动态加载数据功能详解
May 04 PHP
PHP编程文件处理类SplFileObject和SplFileInfo用法实例分析
Jul 22 PHP
PHP使用mysqli同时执行多条sql查询语句的实例
Mar 22 PHP
thinkphp5.1 框架导入/导出excel文件操作示例
May 25 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设计模式之结构模式的深入解析
2013/06/13 PHP
基于OpenCart 开发支付宝,财付通,微信支付参数错误问题
2015/10/01 PHP
10个对初学者非常有用的PHP技巧
2016/04/06 PHP
php获取ip及网址的简单方法(必看)
2017/04/01 PHP
Laravel框架实现即点即改功能的方法分析
2019/10/31 PHP
测试JavaScript字符串处理性能的代码
2009/12/07 Javascript
jquery打开直接跳到网页最下面、最低端实现代码
2013/04/22 Javascript
图片上传判断及预览脚本的效果实例
2013/08/07 Javascript
js实现字符串的16进制编码不加密
2014/04/25 Javascript
为什么Node.js会这么火呢?Node.js流行的原因
2014/12/01 Javascript
js实现class样式的修改、添加及删除的方法
2015/01/20 Javascript
在linux中使用包管理器安装node.js
2015/03/13 Javascript
jQuery定义背景动态切换效果的方法
2015/03/23 Javascript
在Python中使用glob模块查找文件路径的方法
2015/06/17 Javascript
javascript入门教程基础篇
2015/11/16 Javascript
JS中常用的输出方式(五种)
2016/06/12 Javascript
浅谈javascript中的三种弹窗
2016/10/21 Javascript
简单实现JS计算器功能
2016/12/21 Javascript
jQuery访问浏览器本地存储cookie、localStorage和sessionStorage的基本用法
2017/10/20 jQuery
jQuery实现的简单拖拽功能示例【测试可用】
2018/08/14 jQuery
原生JS实现轮播图效果
2018/10/12 Javascript
解决vuex刷新状态初始化的方法实现
2019/08/15 Javascript
PyQt5实现下载进度条效果
2018/04/19 Python
python使用ddt过程中遇到的问题及解决方案【推荐】
2018/10/29 Python
python 中如何获取列表的索引
2019/07/02 Python
python 安装库几种方法之cmd,anaconda,pycharm详解
2020/04/08 Python
工程造价自荐信
2013/10/09 职场文书
素质教育标语
2014/06/27 职场文书
英文自荐信范文
2015/03/25 职场文书
酒店财务部岗位职责
2015/04/14 职场文书
交通事故被告代理词
2015/05/23 职场文书
2015年教师业务工作总结
2015/05/26 职场文书
2016年大学光棍节活动总结
2016/04/05 职场文书
2019年“我为祖国点赞”演讲稿(3篇)
2019/09/26 职场文书
OpenCV-Python 实现两张图片自动拼接成全景图
2021/06/11 Python
Redisson实现Redis分布式锁的几种方式
2021/08/07 Redis