我首先在MAMP上运行代码并且它运行良好.但是当我尝试在另一台服务器上运行代码时,我收到了很多警告:
警告:DOMDocument :: loadHTML():意外的结束标记:head in Entity,line:3349 in /cgihome/zhang1/html/cgi-bin/getPrice.php on line 17警告:DOMDocument :: loadHTML():htmlParseStartTag:放错位置实体中的标签,第33行/cgihome/zhang1/html/cgi-bin/getPrice.php中的行:3350警告:DOMDocument :: loadHTML():标签标头在实体中无效,第3517行/ cgihome/zhang1/html第17行/cgi-bin/getPrice.php
代码如下:
<?php
$amazon = file_get_contents('http://www.amazon.com/blablabla');
$doc = new DOMdocument();
$doc->loadHTML($amazon);
$doc->saveHTML();
$price = $doc -> getElementById('actualPriceValue')->textContent;
$ASIN = $doc -> getElementById('ASIN')->getAttribute('value');
?>
Run Code Online (Sandbox Code Playgroud)
谁知道发生了什么?谢谢!
我正在构建一个使用XPath来分析HTML的命令行php scraping app - 问题是每次在循环中加载新的DOMXPath类实例时我的内存丢失大致等于正在加载的XML的大小.该脚本运行并运行,慢慢增加内存使用量,直到达到限制并退出.
我已经尝试强制垃圾收集,gc_collect_cycles()PHP仍然没有从旧的Xpath请求中获取内存.实际上,DOMXPath类的定义似乎甚至不包含析构函数?
所以我的问题是...... DOMXPath在我已经提取了必要的数据后,有没有办法强制垃圾清理?在类实例上使用unset可以预测不会做任何事情.
代码没什么特别的,只是标准的Xpath东西:
//Loaded outside of loop
$this->dom = new DOMDocument();
//Inside Loop
$this->dom->loadHTML($output);
$xpath = new DOMXPath($this->dom);
$nodes = $xpath->query("//span[@class='ckass']");
//unset($this->dom) and unset($xpath) doesn't seem to have any effect
Run Code Online (Sandbox Code Playgroud)
正如您在上面所看到的,我已经DOMDocument在循环之外保留了新类的实例化,尽管这似乎并没有提高性能.我甚至尝试将$xpath类实例从循环中取出并使用该__constructor方法直接将DOM加载到Xpath中,内存丢失是相同的.
我们在定期运行的脚本之一中出现了严重的内存泄漏,该脚本迅速清除了服务器上的可用内存。尽管进行了数小时的研究和实验,但我什至无法对它产生影响。
这是代码:
echo '1:'.memory_get_usage()."\n";
ini_set('memory_limit', '1G');
echo '2:'.memory_get_usage()."\n";
$oXML = new DOMDocument();
echo '3:'.memory_get_usage()."\n";
$oXML->load('feed.xml'); # 556 MB file
echo '4:'.memory_get_usage()."\n";
$xpath = new DOMXPath($oXML);
echo '5:'.memory_get_usage()."\n";
$oNodes = $xpath->query('//feed/item'); # 270,401 items
echo '6:'.memory_get_usage()."\n";
unset($xpath);
echo '7:'.memory_get_usage()."\n";
unset($oNodes);
echo '8:'.memory_get_usage()."\n";
unset($oXML);
echo '9:'.memory_get_usage()."\n";
Run Code Online (Sandbox Code Playgroud)
这是输出:
1:679016
2:679320
3:680128
4:680568
5:681304
6:150852408
7:150851840
8:34169968
9:34169448
Run Code Online (Sandbox Code Playgroud)
如您所见,当我们使用 xpath 将节点加载到对象中时,内存使用量从 681,304 跃升至 150,852,408。我对此并不十分担心。
我的问题是,即使在销毁 $oNodes 对象之后,我们仍然停留在 34,169,968 的内存使用量上。
但真正的问题是 PHP 显示的内存使用量只是脚本消耗的总内存的一小部分。free -m直接从服务器上的命令行使用,我们从使用的 3,295 MB 内存增加到 5,226 MB ——并且永远不会减少 …
请帮助您解析PHP简单的html字符串(php regexp)。我需要从html代码中删除html-js事件。我知道php正则表达式非常糟糕。
代码示例:
<button onclick="..javascript instruction..">
结果: <button>
<button onclick="..javascript instruction.." value="..">
结果: <button value="..">
<button onclick=..javascript instruction..>
结果: <button>
<button onclick=..javascript instruction.. value>
结果: <button value>
我需要在不使用引号的情况下执行此操作,因为所有现代浏览器都允许执行属性而无需使用仲裁。
注意:我nedd不仅解析onclick ..都是从'on'开始的所有属性。
注意事项(2):不要尝试建议HTML解析器,因为它对于解析而言将是非常大的树。
更新:谢谢您的回复!现在,我使用由我编写的HTMLPurifier组件一个小框架。
php ×4
dom ×2
xpath ×2
domxpath ×1
events ×1
html ×1
javascript ×1
memory ×1
memory-leaks ×1
regex ×1