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
)时,它不会崩溃。为什么?第一个有什么问题?

  • 第一次使用
    $e->nodeValue='
    删除所有子节点(it it it it it it ok?
  • 第二个保留一个(任意)子节点并用于删除。。。一个额外的解决办法,以避免在某些标记存在时完全删除

“等效”函数#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