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 相关文章推荐
ADODB类使用
Nov 25 PHP
生成php程序的php代码
Apr 07 PHP
使用PHP遍历文件夹与子目录的函数代码
Sep 26 PHP
PHP禁止页面缓存的代码
Oct 23 PHP
php判断字符串在另一个字符串位置的方法
Feb 27 PHP
PHP根据传来的16进制颜色代码自动改变背景颜色
Jun 13 PHP
PHP使用mysqldump命令导出数据库
Apr 14 PHP
Docker 如何布置PHP开发环境
Jun 21 PHP
php微信开发之自定义菜单完整流程
Oct 08 PHP
php 遍历目录,生成目录下每个文件的md5值并写入到结果文件中
Dec 12 PHP
PHP cookie与session会话基本用法实例分析
Nov 18 PHP
如何在PHP中生成随机数
Jun 04 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开发环境配置记录
2011/01/14 PHP
php切割页面div内容的实现代码分享
2012/07/31 PHP
浅析SVN常见问题及解决方法
2013/06/21 PHP
php环境无法上传文件的解决方法
2014/04/30 PHP
Yii 2.0中场景的使用教程
2017/06/02 PHP
PHP chunk_split()函数讲解
2019/02/12 PHP
jQuery boxy弹出层插件中文演示及使用讲解
2011/02/24 Javascript
js中substring和substr的详细介绍与用法
2013/08/29 Javascript
PHP+mysql+Highcharts生成饼状图
2015/05/04 Javascript
7个jQuery最佳实践
2016/01/12 Javascript
Nodejs回调加超时限制两种实现方法
2017/06/09 NodeJs
JavaScript定时器setTimeout()和setInterval()详解
2017/08/18 Javascript
基于require.js的使用(实例讲解)
2017/09/07 Javascript
Node.js实现注册邮箱激活功能的方法示例
2018/03/23 Javascript
Nodejs 和 Electron ubuntu下快速安装过程
2018/05/04 NodeJs
支付宝小程序实现省市区三级联动
2020/06/21 Javascript
vue3为什么要用proxy替代defineProperty
2020/10/19 Javascript
[03:04]DOTA2英雄基础教程 影魔
2013/12/11 DOTA
[00:28]DOTA2北京网鱼队选拔赛
2015/04/08 DOTA
python根据距离和时长计算配速示例
2014/02/16 Python
Python解惑之True和False详解
2017/04/24 Python
利用python循环创建多个文件的方法
2018/10/25 Python
Python学习笔记之pandas索引列、过滤、分组、求和功能示例
2019/06/03 Python
python实现点击按钮修改数据的方法
2019/07/17 Python
python selenium登录豆瓣网过程解析
2019/08/10 Python
Python 求数组局部最大值的实例
2019/11/26 Python
解决Pyinstaller打包软件失败的一个坑
2021/03/04 Python
需要知道的CSS3动画技术
2010/01/01 HTML / CSS
财产公证书样本
2014/04/04 职场文书
反腐倡廉标语
2014/06/24 职场文书
2014客服代表实习自我鉴定
2014/09/18 职场文书
干部年终考核评语
2015/01/04 职场文书
音乐教师求职信范文
2015/03/20 职场文书
2016教师节问候语
2015/11/10 职场文书
Java elasticsearch安装以及部署教程
2021/06/28 Java/Android
Redis特殊数据类型Geospatial地理空间
2022/06/01 Redis