Php 为什么这个DOM replaceNode函数有时会崩溃?
第一个函数(如下)运行良好,在同一节点的多个节点上循环但有时会崩溃(没有错误消息,但会停止服务器) 当我们在同一个节点循环中使用第二个(Php 为什么这个DOM replaceNode函数有时会崩溃?,php,domdocument,Php,Domdocument,第一个函数(如下)运行良好,在同一节点的多个节点上循环但有时会崩溃(没有错误消息,但会停止服务器) 当我们在同一个节点循环中使用第二个(replace\u innerXML\u secure)时,它不会崩溃。为什么?第一个有什么问题? 第一次使用$e->nodeValue='删除所有子节点(it it it it it it ok?) 第二个保留一个(任意)子节点并用于删除。。。一个额外的解决办法,以避免在某些标记存在时完全删除 “等效”函数#1和#2: 笔记 EDIT2对于@Prix请
replace\u innerXML\u secure
)时,它不会崩溃。为什么?第一个有什么问题?
- 第一次使用
删除所有子节点(it it it it it it ok?)李>$e->nodeValue='
- 第二个保留一个(任意)子节点并用于删除。。。一个额外的解决办法,以避免在某些标记存在时完全删除
“等效”函数#1和#2:
笔记 EDIT2对于@Prix请求,举个例子 该循环非常复杂,但可以模拟为
// use this with ANY (and a lot of) BIG HTML files from web...
// I have ~1 error/100 samples
$dom = new DOMDocument();
$dom->load($file); // any XML, or loadHTMLfile()
$plst = array(); // you can take off the rand()
foreach ($dom->getElementsByTagName('*') as $node) if (1 || rand(1,3)==1) {
$plst[] = $node->getNodePath();
}
rsort($plst); // from leaves to root
foreach ($plst as $p) {
$xp = new DOMXpath($dom); // refresh for each $p
$node = $xp->query($p);
if ($node->length && $node=$node->item(0))
// USING HERE the function#1 or #2:
replace_innerXML($node,'<new x="1">text</new>');
}
$dom->normalizeDocument();
EDIT1版本和日志
版本:
- libxml2:2.8.0+dfsg1-7+喘息1
- php5:5.4.4-14+deb7u14
- apache2:2.2.22-13+deb7u3
/var/log/apache2/error.log
,但那里没有错误(只有一个常见的png“File not existing”在成功的http中)
。。。在这台机器上,今天再次运行,http崩溃后,没有大的错误报告,只有“文件不存在:/var/www/favicon.ico”在崩溃前。。。但是我也在Ubuntu机器上运行,在那里我发现(!)一份关于崩溃日期和瞬间的报告:
[Wed Oct 15 20:16:16.840578 2014] [core:notice] [pid 1770] AH00051: child pid 14873 exit signal Segmentation fault (11), possible coredump in /etc/apache2
[Wed Oct 15 20:16:16.840684 2014] [core:notice] [pid 1770] AH00051: child pid 14879 exit signal Segmentation fault (11), possible coredump in /etc/apache2
*** Error in `/usr/sbin/apache2': corrupted double-linked list: 0x00007f457b81af70 ***
[Wed Oct 15 20:16:56.886473 2014] [core:notice] [pid 1770] AH00051: child pid 14844 exit signal Aborted (6), possible coredump in /etc/apache2
[Wed Oct 15 20:16:57.887638 2014] [core:notice] [pid 1770] AH00051: child pid 14894 exit signal Segmentation fault (11), possible coredump in /etc/apache2
是的,一场大崩盘,不知道为什么。(我记得LibXML2中的“标准coredump问题”是不存在的删除或写入节点)。虽然我没有发现代码有任何奇怪之处(在我的机器上用几个xml测试了它,没有发现任何问题),但我怀疑有什么东西在某种程度上使用了它,导致了无限递归 众所周知,输入太深递归的函数会导致PHP出现SEGFAULTs。[, ] 或者是一个严重的PHP/libxml2错误
也许问题出在其他地方?为什么要使用大于运算符将变量与空字符串进行比较?哼。。。是的,在PHP
$a!=''中
和$a>'
是相同的。PS:有人投了反对票,这是解释吗?我编辑了,现在好多了?哦,好吧,我不知道。我不是那个投了否决票的人。我打赌Apache日志中没有消息?@rr-我编辑了。。。没有好的日志…请参阅notes/edit2:PHP代码中没有无限递归(可能libxml2丢失了一些指针并执行了一个循环…?)。好的,我的答案中哪一部分需要向下投票?
<?xml version="1.0" encoding="utf-8"?>
<article dtd-version="3.0" article-type="research-article" xml:lang="en">
<front><journal-meta>
<journal-title-group><journal-title>text text text</journal-title>
<abbrev-journal-title abbrev-type="acronym">aaaa</abbrev-journal-title>
<abbrev-journal-title abbrev-type="publisher">aaabbb aaa</abbrev-journal-title>
</journal-title-group>
<etc>....</etc>
<history><date date-type="received"><label>Received</label> 9 July 2014</date>
<date date-type="accepted"><label>Accepted</label> 25 July 2014</date>
</history>
</journal-meta></front>
<body>
<p>Nonnnononn onononono nonono</p>
<fn><p><label>XXXXX yyyyy</label>: xxxx@aaa.com</p></fn>
<p>Nonnnononn onononono nonono nonono </p>
</body>
</article>
[Wed Oct 15 20:16:16.840578 2014] [core:notice] [pid 1770] AH00051: child pid 14873 exit signal Segmentation fault (11), possible coredump in /etc/apache2
[Wed Oct 15 20:16:16.840684 2014] [core:notice] [pid 1770] AH00051: child pid 14879 exit signal Segmentation fault (11), possible coredump in /etc/apache2
*** Error in `/usr/sbin/apache2': corrupted double-linked list: 0x00007f457b81af70 ***
[Wed Oct 15 20:16:56.886473 2014] [core:notice] [pid 1770] AH00051: child pid 14844 exit signal Aborted (6), possible coredump in /etc/apache2
[Wed Oct 15 20:16:57.887638 2014] [core:notice] [pid 1770] AH00051: child pid 14894 exit signal Segmentation fault (11), possible coredump in /etc/apache2