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 相关文章推荐
类的另类用法--数据的封装
Oct 09 PHP
flash用php连接数据库的代码
Apr 21 PHP
php中在PDO中使用事务(Transaction)
May 14 PHP
php中防止伪造跨站请求的小招式
Sep 02 PHP
如何在smarty中增加类似foreach的功能自动加载数据
Jun 26 PHP
PHP_NETWORK_GETADDRESSES: GETADDRINFO FAILED问题解决办法
May 04 PHP
PHP实现抓取HTTPS内容
Dec 01 PHP
PHP利用hash冲突漏洞进行DDoS攻击的方法分析
Mar 26 PHP
YII2.0之Activeform表单组件用法实例
Jan 09 PHP
php代码架构的八点注意事项
Jan 25 PHP
Thinkphp通过一个入口文件如何区分移动端和PC端
Apr 18 PHP
PHP根据树的前序遍历和中序遍历构造树并输出后序遍历的方法
Nov 10 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 session处理的定制
2009/03/16 PHP
php中通过DirectoryIterator删除整个目录的方法
2015/03/13 PHP
CodeIgniter分页类pagination使用方法示例
2016/03/28 PHP
浅谈Laravel中的一个后期静态绑定
2017/08/11 PHP
jQuery对象和DOM对象的相互转化实现代码
2010/03/02 Javascript
javascript调试说明
2010/06/07 Javascript
jQuery快速上手:写jQuery与直接写JS的区别详细解析
2013/08/26 Javascript
简体中文转换繁体中文(实现代码)
2013/12/25 Javascript
jquery预览图片实现鼠标放上去显示实际大小
2014/01/16 Javascript
HTML5 Shiv完美解决IE(IE6/IE7/IE8)不兼容HTML5标签的方法
2015/11/25 Javascript
js验证框架之RealyEasy验证详解
2016/06/08 Javascript
Bootstrap面板学习使用
2017/02/09 Javascript
Vue.js进阶知识点总结
2018/04/01 Javascript
vue引入静态js文件的方法
2020/06/20 Javascript
JS sort排序详细使用方法示例解析
2020/09/27 Javascript
[31:47]夜魇凡尔赛茶话会 第三期01:选手知多少
2021/03/11 DOTA
python中关于时间和日期函数的常用计算总结(time和datatime)
2013/03/08 Python
python读取csv文件示例(python操作csv)
2014/03/11 Python
Linux下通过python访问MySQL、Oracle、SQL Server数据库的方法
2016/04/23 Python
利用Python如何将数据写到CSV文件中
2018/06/05 Python
python得到电脑的开机时间方法
2018/10/15 Python
Python3实现的判断回文链表算法示例
2019/03/08 Python
python调用HEG工具批量处理MODIS数据的方法及注意事项
2020/02/18 Python
Pytorch mask-rcnn 实现细节分享
2020/06/24 Python
英国第一蛋白粉品牌:Myprotein
2016/09/14 全球购物
WoolOvers爱尔兰:羊绒、羊毛和棉针织品
2017/01/04 全球购物
美国网上购买眼镜:Eyeconic
2017/07/29 全球购物
荷兰在线体育用品商店:Avantisport.nl
2018/07/04 全球购物
Notino希腊:购买香水和美容产品
2019/07/25 全球购物
Android面试题附答案
2014/12/08 面试题
初任培训自我鉴定
2013/10/07 职场文书
交通安全寄语大全
2014/04/08 职场文书
《风娃娃》教学反思
2014/04/19 职场文书
休假证明书
2015/06/24 职场文书
GitHub上77.9K的Axios项目有哪些值得借鉴的地方详析
2021/06/15 Javascript
详解如何使用Nginx解决跨域问题
2022/05/06 Servers