2014-03-28 78 views
4

偶爾我遇到問題,PHP文件在大型系統上的某處在某些情況下會產生虛假輸出。是否有可能確定哪個PHP文件生成一些輸出

這可能是因爲有人不小心輸入空格或其他字符<?php開始標記之前,或留在原位不想要的調試echo或包含最終收盤?>標籤後,一些空白。

有沒有什麼方法可以生成一個日誌,顯示所有生成一些輸出的PHP文件,以及它們生成的輸出?

如果沒有,是否有其他方式可以建議追蹤我描述的問題?

編輯:澄清 - 我運行的系統是Moodle(不直接相關,但是因爲它被問到......),在這種情況下,輸出是在數據庫升級期間(但我已經在其他時間輸出隨機字符的類似問題)。有很多不同的PHP腳本被加載到內存中以生成頁面,因此手動識別產生不需要的輸出的頁面並不是一個非常誘人的前景...

+1

headers_sent($ file,$ line)可以告訴你至少第一個輸出是在哪裏生成的,請參閱http://docs.php.net/headers_sent – VolkerK

+0

我想你需要訪問Web服務器。如果您擁有個人服務器,這是可能的。 – Tabby

+4

在相關說明中,如果可以的話,完全避免使用'?>' - 它是可選的,並且在純PHP文件中通常很痛苦。 – hexblot

回答

1

,如果你的「唯一」值得關注的是PHP標籤token_get_all()可以幫助您之外的文本。在php標籤之外的所有內容(?)被報告爲T_INLINE_HTML(312),因此很容易過濾。
例如

<?php 
for($t=0;$t<10; $t++) { ?> 

<?php 
} 
?> 

<?php 
$at = token_get_all(file_get_contents(__FILE__)); 
foreach($at as $t) { 
    if (is_array($t) && T_INLINE_HTML===$t[0]) { 
     echo 'inline html @ line ', $t[2], "\r\n"; 
    } 
} 

打印(一些空行和)

inline html @ line 3 
inline html @ line 7 

結合起來,與類似get_included_files()RecursiveDirectoryIterator和你有任務一點點的臨時工具。

+0

這看起來像一個很好的解決方案 - 我會試一試,看看它是否有效。 – davosmith

+0

我把這個包裹在scandir的遞歸調用中(通過擴展名.php過濾),添加了一個檢查$ t [1]的長度<20,並檢查其中是否存在該字母''在這種情況下是可見的輸出)。之後,通過結果的快速檢查設法找到問題。謝謝你的幫助。 – davosmith

0

有幾種方法可以做到這一點但是除非你編寫了代碼,否則這是一項耗時的工作。確保你打開錯誤報告這可能也有幫助。

1)安裝 Apachetop

該工具會掃描你的web服務器的日誌文件顯示該文件被稱爲你,它也有一些其他有趣的功能

2)使用lsof

watch -n1 "lsof | grep '\.php'" 

上面的代碼行只會列出已打開的.php文件。如果文件打開和關閉速度很快,可能無法列出它

3)使用xdebug和xdebug分析器。

當你運行代碼時;同時檢查xdebug分析器並不斷刷新它。分析器的一個特點是它繪製了被調用文件的可視化映射。您將不得不手動檢查這些文件的語法錯誤或錯誤/錯誤的邏輯。如果你知道或者如果你製作了這個系統,那麼你可以輕鬆地做到這一點。

我希望這有助於

+0

錯誤報告已打開,它是在當前計算機上運行的開發服務器。我已經安裝了xdebug和xhprof(Moodle,我正在使用的框架,內置了對xhprof進行分析的支持)。問題是,在運行這段代碼的時候,有幾百個PHP文件(至少)被加載,所以我希望將事情縮小到實際產生某種形式的輸出。 – davosmith

相關問題