2014-03-18 74 views
2

我在使用PHP 5.4.21的IIS 7服务器上使用PHP脚本生成XML数据。我注意到这些数据没有通过XML验证,因为看起来随机的标签会将它们的“<”或“< /”从它们上剥离。我运行了一些测试,通过将预期的XML输出放在一个2个单独的文件中,一个扩展名为.php(没有实际的PHP)和一个扩展名为.xml的文件(它们的内容完全相同)来运行一些测试。 PHP文件,但这不会通过PHP解释器)。 .xml扩展名文件没有任何字符在.php扩展名文件中消失。然后在我的本地WAMP服务器上运行相同的PHP脚本也工作得很好。这一切都让我认为这个问题必须与PHP。问题是我不知道为什么会发生这种情况,而且迄今为止我还没有成功搜索Google的答案。IIS 5.4上的PHP 5.4.21在标签中删除“<”和“</”

下面是导致错误的代码示例,以便您可以了解正在发生的事情。

<?php 
    print "<?xml version=\"1.0\"?>\n"; 
    print "<appguide>\n"; 
    print "\t<wheels>\n"; 

    for ($i = 0; $i < 80; $i++) { 
     print "\t\t<wheel>\n"; 
     print "\t\t\t<someone>{$i}</someone>\n"; 
     print "\t\t\t<set>{$i}</set>\n"; 
     print "\t\t\t<us>{$i}</us>\n"; 
     print "\t\t\t<up>{$i}</up>\n"; 
     print "\t\t\t<the>{$i}</the>\n"; 
     print "\t\t\t<bomb>{$i}</bomb>\n"; 
     print "\t\t</wheel>\n"; 
    } 

    print "\t</wheels>\n"; 
    print "</appguide>\n"; 
?> 

这应该简单地打印相同的数据中的“<车轮>”一节中的80倍。但与此观察它的源IIS7/PHP5.4.2机器上出现:

<wheel> 
    <someone>30</someone> 
    <set>30set> 
    <us>30</us> 
    <up>30</up> 
    <the>30</the> 
    <bomb>30</bomb> 
</wheel> 

正如你可以看到“< /”从缺“< /集>”,在第31次迭代中循环。即使我不使用PHP来生成XML数据,并将预期的输出粘贴到文件中(与XML文件相同),它仍然会丢失括号。

那么有没有人有任何线索可能导致这种?!

更新为询问了HTTP响应头的人:

Live服务器

Content-Length:10326 
Content-Type:text/html 
Date:Tue, 18 Mar 2014 22:35:47 GMT 
Server:Microsoft-IIS/7.5 
X-Powered-By:PHP/5.4.21 
X-Powered-By:ASP.NET 

本地服务器

Connection:Keep-Alive 
Content-Type:text/html; charset=ISO-8859-1 
Date:Tue, 18 Mar 2014 22:35:19 GMT 
Keep-Alive:timeout=5, max=99 
Server:Apache/2.2.11 (Win32) PHP/5.3.1 
Transfer-Encoding:chunked 
X-Powered-By:PHP/5.3.1 
+0

奇怪。你的代码对我来说工作得很好。 (PHP 5.5.3-1ubuntu2.2) – Mike

+0

是的。就像我在原文中所说的那样,“在我的本地WAMP服务器上运行相同的PHP脚本运行良好”。因此,我发布了IIS和PHP版本(这两个版本都不符合你的测试)。 –

+0

两个服务器中的HTTP响应标头是否相同? – Mike

回答

0

有时怪异的虫子被编码-有关。可能有一些特殊的秘密含义的IIS7在这个独特

t>30</s 

组合 - 它只能通过你的循环发生一次,在31次迭代。

我有一个IIS不能访问,但作为一个测试,我会想办法暂时命名

<set> 

标签,看看是否有什么变化。

+0

我也曾考虑过这个问题。您可以更改标签以说出任何内容,但如果字符数相同,则错误将位于完全相同的位置。 –

+0

对不起,这应该是一个评论,而不是一个答案,为时已晚。还有两件事让我想起来:1)你是否尝试使用_echo_而不是_print_ - 或_heredoc_?和2)工作机器上的php.ini设置和非工作机器是相同的? – niennte