2014-03-18 73 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