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文件读写操作之文件写入代码
Jan 13 PHP
10个实用的PHP代码片段
Sep 02 PHP
逆序二维数组插入一元素的php代码
Jun 08 PHP
php加密算法之实现可逆加密算法和解密分享
Jan 21 PHP
PHP判断是否连接上网络的方法
Jul 01 PHP
php抓取网站图片并保存的实现方法
Oct 29 PHP
php实现学生管理系统
Mar 21 PHP
解决laravel 5.1报错:No supported encrypter found的办法
Jun 07 PHP
PHP使用PDO访问oracle数据库的步骤详解
Sep 29 PHP
PHP简单实现欧拉函数Euler功能示例
Nov 06 PHP
PHP array_reverse() 函数原理及实例解析
Jul 14 PHP
利用PHP计算有多少小于当前数字的数字方法示例
Aug 26 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
动态新闻发布的实现及其技巧
2006/10/09 PHP
PHP中的按位与和按位或操作示例
2014/01/27 PHP
PHP图片库imagemagick安装方法
2014/09/23 PHP
PHP4和PHP5版本下解析XML文档的操作方法实例分析
2017/05/20 PHP
PHPStorm 2020.1 调试 Nodejs的多种方法详解
2020/09/17 NodeJs
jquery $.each() 使用小探
2013/08/23 Javascript
JavaScript中使用数组方法汇总
2016/02/16 Javascript
Web前端开发工具——bower依赖包管理工具
2016/03/29 Javascript
第二篇Bootstrap起步
2016/06/21 Javascript
AngularJS 过滤器的简单实例
2016/07/27 Javascript
深入浅析search 搜索框的写法
2016/08/02 Javascript
AngularJS的依赖注入实例分析(使用module和injector)
2017/01/19 Javascript
JS基于面向对象实现的多个倒计时器功能示例
2017/02/28 Javascript
es6+angular1.X+webpack 实现按路由功能打包项目的示例
2017/08/16 Javascript
详解vue 实例方法和数据
2017/10/23 Javascript
JavaScript原型对象、构造函数和实例对象功能与用法详解
2018/08/04 Javascript
深入浅析Node.js 事件循环、定时器和process.nextTick()
2018/10/22 Javascript
Vue 组件修改根实例的数据的方法
2019/04/02 Javascript
javascript实现前端成语点击验证优化
2020/06/24 Javascript
Vue3不支持Filters过滤器的问题
2020/09/24 Javascript
python实现SMTP邮件发送功能
2020/06/16 Python
Python标准库之collections包的使用教程
2017/04/27 Python
python实现报表自动化详解
2017/11/16 Python
python爬虫框架scrapy实现模拟登录操作示例
2018/08/02 Python
python算法与数据结构之冒泡排序实例详解
2019/06/22 Python
Tensorflow 自定义loss的情况下初始化部分变量方式
2020/01/06 Python
解析PyCharm Python运行权限问题
2020/01/08 Python
Python短信轰炸的代码
2020/03/25 Python
利用CSS3的transform做的动态时钟效果
2011/09/21 HTML / CSS
美国美发品牌:Bumble and Bumble
2016/10/08 全球购物
自主招生自荐信指南
2014/02/04 职场文书
班级体育活动总结
2014/07/05 职场文书
婚庆答谢词
2015/01/04 职场文书
计算机专业自荐信范文
2015/03/26 职场文书
千手观音观后感
2015/06/03 职场文书
springboot + mongodb 通过经纬度坐标匹配平面区域的方法
2021/11/01 MongoDB