手机浏览 RSS 2.0 订阅 膘叔的简单人生 , 腾讯云RDS购买 | 超便宜的Vultr , 注册 | 登陆
浏览模式: 标准 | 列表2024年09月的文章

转:phpQuery占用过多内存的解决方法

事实上,看到这篇文章的时候,我早就已经解决这个问题了。目前我也是这么做的,只是我是设置phpQuery::$documents = null而已,和他不太一样。
但本文做了一点分析,所以我还是正常的贴一下吧。

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";
}

内存占用稳定了。

----
原文来自:http://www.linuxsong.org/2011/01/phpquery-memory-leak/
其实出现上面的问题很正常,大多数人在用pq的时候都是在不停的抓取和采集,一般在命令行下面,这时候都不会想到释放内存,而平时网页的话,一个页面结束后,这些内存都还是会自动释放掉一点。如果不是狠狠抓数据的人,是不会遇到这种问题的啦。

Tags: phpquery, 内存

笔记:removeAttr

这个标题我扔到PHP分类下当然是有原因的。。
因为我最近在尝试用phpQuery来分析数据,但这些数据最终的样式都和我真正想要的还是有点区别,所以我要去除其中的样式,还要删除空标签,但:empty标签删除的太厉害了。不太敢用
所以我还是用正则来删除一级的标签。

除了空标签还有这些带样式的,我开始是用pq("xxx")->css("");来设置空标签,但总觉得不爽,因为这样会生成<p style="">这种多余的内容。
找了一点资料,其实jQuery的removeAttr就可以有这个功能啦。于是乎,pq("xxx")->removeAttr("style"),就解决了

做个笔记

Tags: phpquery, jquery

备份:html5 canvas cheat sheet

纯备份资料,HTML5的canvas资料
大小: 88.14 K
尺寸: 500 x 370
浏览: 2486 次
点击打开新窗口浏览全图

Tags: html5, canvas, cheat sheet

转:五段实用的js淫荡技巧

奇技淫巧?其实不能算是什么特别的东西,但有些小技巧还是可以试试的,比如说第一个,我们一般都会是用setInterval,然后每1秒执行一次,10秒后取消,但setTimeout也可以。只是意义不大而已喽
原文来自:http://www.cnblogs.com/nothingbrother/archive/2011/12/19/2293131.html

应用案例:比如你想一个函数循环执行10次,怎么办?以前通常是先setInterval,然后clearInterval,技巧一就是克服这个问题

JavaScript代码
  1. (function () {  
  2.     var i = 0;  
  3.     function job() {  
  4.         console.log(i++);  
  5.         if (i < 10) {  
  6.             setTimeout(job, 1000);  
  7.         }  
  8.     }  
  9.     job();  
  10.       
  11. })();  

上面这个job函数就只会乖乖的执行10次.然后自动停止

技巧二之高效的for循环 

应用案例:抛弃传统的循环方式

JavaScript代码
  1. (function () {  
  2.    var arr=[];  
  3.    for(var i=arr.length;i--;){  
  4.       doStuff();  
  5.    }  
  6. })();  

这个方式为什么高效?

一:少了一个参数l=arr.length;

二:for语句中间那个玩意少进行了一次计算,以前的话是for(i=0;i<l;i++)这样的话中间的语句会先比较i<l  然后比较出来的结果在

跟true 或者false比较,自然多了次计算

技巧三之高效赋值 

应用案例:抛弃传统的if判断赋值

JavaScript代码
  1. var i=1,ret;  
  2.   ret=i!==1||true;  
  3.   console.log(ret);  

以上代码会很神奇的告诉你ret会是true.高效吧不用if(i!==1)了在赋值了

技巧四之强悍的简短的attr 

应用案例:setAttribute,getAttribute.这个方法不仅可以设置标准的属性,还可以设置任意属性,兼容好

JavaScript代码
  1. function attr(elem, name, value) {  
  2.     var ret;  
  3.     if (value) {  
  4.         if (/msie [6-7]\.0/i.test(navigator.userAgent)) {  
  5.             ret = elem.getAttributeNode(name);  
  6.             if (!ret) {   //ie6 7不合法的属性设置捕鸟,通过这里可以设置  
  7.                 ret = document.createAttribute(name);  
  8.                 elem.setAttributeNode(ret);  
  9.             }  
  10.             ret.nodeValue = value + "";  
  11.         } else {  
  12.             elem.setAttribute(name, value);  
  13.         }  
  14.         return elem;  
  15.     } else {  //ie6 7有得属性获取不鸟  
  16.         ret = elem.getAttribute(name);  
  17.         fixIe = elem.getAttributeNode(name).nodeValue;  
  18.         ret = ret ? ret : fixIe ? fixIe : undefined;  
  19.         return ret;  
  20.     }  
  21. }  

以上方法如何测试呢?

 attr(document.getElementById("test"), "classxx", "xx")
 alert(attr(document.getElementById("test"),"classxx"));

技巧五之getElementsByClassName. 

应用案例 :以前js没什么框架的时候,大家都再模仿这个方法,看看今天我是怎么高效的模仿出它来.这也不愧是js初学者的经典代码

JavaScript代码
  1. (function () {  
  2.    var getElementsByClassName=function(cls,context){  
  3.       var root = context || document;  
  4.     return document.querySelectorAll ? root.querySelectorAll("." + cls) : root.getElementsByClassName ?  
  5.            root.getElementsByClassName(cls) : help("*", cls, context);  
  6.    }  
  7.    var help=function(tagName,cls,context){  
  8.         var root= context || document,  
  9.             ret=[],elems,i,  
  10.             rcls=new RegExp("^|\\s+"+cls+"\\s+|$");  
  11.         elems = root.getElementsByTagName(tagName || "*");  
  12.         for(i=elems.length;i--;){  
  13.             if(rcls.test(elem[i].className)){  
  14.               ret.push(elems[i]);  
  15.             }  
  16.         }  
  17.         return ret;  
  18.    }  
  19. })();  
以上几个js淫荡技巧还是蛮实用的,前提是你没用使用别人的js框架,用原生创造效率为前提的代码.

----------

上面的代码其实真要说的话也就这样样了,但如果你以前没有接触过原生代码,还是可以折腾的。比如最后一个函数,在JS的高版本中(或者说FF5以上,Safari5以上,)都在支持了querySelector了。这个玩意可是直接支持.class或者#id之类(就象jQuery的选择器)

多学一点东西还是有好处的。

 

 

 

 

备份资料:一般的header

HTTP/1.1 200 OK Date: Wed, 05 Nov 2003 10:46:04 GMT Server: Apache/1.3.28 (Unix) PHP/4.2.3 Content-Location: CSS2-REC.en.html Vary: negotiate,accept-language,accept-charset TCN: choice P3P: policyref=http://www.w3.org/2001/05/P3P/p3p.xml Cache-Control: max-age=21600 Expires: Wed, 05 Nov 2003 16:46:04 GMT Last-Modified: Tue, 12 May 1998 22:18:49 GMT ETag: "3558cac9;36f99e2b" Accept-Ranges: bytes Content-Length: 10734 Connection: close Content-Type: text/html; charset=utf-8 Content-Language: en

这是一个资料备份,常见的head头部