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 相关文章推荐
7个超级实用的PHP代码片段
Jul 11 PHP
php输出echo、print、print_r、printf、sprintf、var_dump的区别比较
Jun 21 PHP
PHP+shell脚本操作Memcached和Apache Status的实例分享
Mar 11 PHP
CodeIgniter开发实现支付宝接口调用的方法示例
Nov 14 PHP
php实现连接access数据库并转txt写入的方法
Feb 08 PHP
php及codeigniter使用session-cookie的方法(详解)
Apr 06 PHP
laravel学习笔记之模型事件的几种用法示例
Aug 15 PHP
PHP进阶学习之命名空间基本用法分析
Jun 18 PHP
laravel批量生成假数据的方法
Oct 09 PHP
gearman中worker常驻后台,导致MySQL server has gone away的解决方法
Feb 27 PHP
php设计模式之原型模式分析【星际争霸游戏案例】
Mar 23 PHP
PHP设计模式(四)原型模式Prototype实例详解【创建型】
May 02 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中一个有意思的日期逻辑处理
2012/03/25 PHP
七款最流行的PHP本地服务器分享
2013/02/19 PHP
Linux系统下php获得系统分区信息的方法
2015/03/30 PHP
php统计数组元素个数的方法
2015/07/02 PHP
php实现的证件照换底色功能示例【人像抠图/换背景图】
2020/05/29 PHP
用javascript获得地址栏参数的两种方法
2006/11/08 Javascript
JavaScript中将一个值转换为字符串的方法分析[译]
2012/09/21 Javascript
禁止选中文字兼容IE、Chrome、FF等
2013/09/04 Javascript
jquery操作cookie插件分享
2014/01/14 Javascript
Nodejs学习笔记之测试驱动
2015/04/16 NodeJs
javascript点击按钮实现隐藏显示切换效果
2016/02/03 Javascript
vue.js单页面应用实例的简单实现
2017/04/10 Javascript
webpack4 + react 搭建多页面应用示例
2018/08/03 Javascript
详解javascript appendChild()的完整功能
2018/08/18 Javascript
如何为你的JavaScript代码日志着色详解
2019/04/08 Javascript
详解auto-vue-file:一个自动创建vue组件的包
2019/04/26 Javascript
vue3.0中的双向数据绑定方法及优缺点
2019/08/01 Javascript
Layui给switch添加响应事件的例子
2019/09/03 Javascript
[08:56]DOTA2-DPC中国联赛2月23日Recap集锦
2021/03/11 DOTA
Python并发编程协程(Coroutine)之Gevent详解
2017/12/27 Python
使用python+whoosh实现全文检索
2019/12/09 Python
关于Pytorch的MLP模块实现方式
2020/01/07 Python
基于Python中random.sample()的替代方案
2020/05/23 Python
解决Pytorch自定义层出现多Variable共享内存错误问题
2020/06/28 Python
python 实现弹球游戏的示例代码
2020/11/17 Python
毕业生如何写自荐信
2014/03/26 职场文书
中学生运动会新闻稿
2014/09/24 职场文书
2014小学语文教学工作总结
2014/12/17 职场文书
迟到检讨书范文
2015/01/27 职场文书
入党申请书格式
2019/06/20 职场文书
导游词之珠海轮廓
2019/10/25 职场文书
python实现ROA算子边缘检测算法
2021/04/05 Python
HTML速写之Emmet语法规则的实现
2021/04/07 HTML / CSS
使用Python拟合函数曲线
2022/04/14 Python
Android使用EventBus发送消息,Fragment中接收消息的方法会执行多次
2022/04/24 Java/Android
Fluentd搭建日志收集服务
2022/09/23 Servers