相关疑难解决方法(0)

Dom loadHTML在服务器上无法正常工作

我首先在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)

谁知道发生了什么?谢谢!

php dom

26
推荐指数
3
解决办法
3万
查看次数

DOMDocument/Xpath在长命令行过程中泄漏内存 - 解构此类的任何方法

我正在构建一个使用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中,内存丢失是相同的.

php xpath domxpath

5
推荐指数
1
解决办法
1928
查看次数

PHP XML 内存泄漏?

我们在定期运行的脚本之一中出现了严重的内存泄漏,该脚本迅速清除了服务器上的可用内存。尽管进行了数小时的研究和实验,但我什至无法对它产生影响。

这是代码:

    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 memory xpath dom memory-leaks

5
推荐指数
1
解决办法
1208
查看次数

从HTML标记中删除on * JS事件属性

请帮助您解析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组件一个小框架。

html javascript php regex events

2
推荐指数
1
解决办法
2164
查看次数

标签 统计

php ×4

dom ×2

xpath ×2

domxpath ×1

events ×1

html ×1

javascript ×1

memory ×1

memory-leaks ×1

regex ×1