2011-08-28 46 views
4

我會通過客戶的服務器,運行瘋狂的專有論壇 軟件(vBulletin),甚至更糟糕的SEO器官功能障礙綜合徵(vbseo)。我無法將 列出來,其中頁面的php代碼來自哪裏!如何跟蹤此 URL回PHP頁面: http://www.example.com/forum/members/connie.html 我剛剛加入與基於大量修改vBullitin與VBSEO插件安裝代碼的項目。這個特別的插件是可怕的意大利麪代碼,包含幾十個include()s,.htaccess重定向和可能的.httpd.conf更改。然後它從數據庫中提取字符串,所以我甚至不能使用grep來查找代碼文件!追查代碼從(PHP)來

是否有任何方法來堆棧跟蹤PHP來記錄運行生成頁面的所有代碼?我有root權限,但我不應該停止或重新啓動服務器。進入生成頁面的文件include()層次結構的簡單列表就足夠了。

請注意,我不能使用debug_backtrace因爲我不知道我要找的代碼! debug_backtrace函數與我所需要的完全相反。

謝謝。

回答

4

聽起來像是你需要通過它與Xdebug步驟。最常見的IDE支持它,如NetbeansPHPStorm

資源:

在這兩個上面提到的IDE的,你可以CTRL +點擊函數/方法,它會帶你到文件中的行定義它。您還可以跟蹤函數和變量的用法。

跟蹤代碼內置於xdebug。下面是Zend的一個例子:

<?php 

    xdebug_start_trace('c:/data/fac.xt'); 

    print fac(7); 

    function fac($x) 
    { 
    if (0 == $x) return 1; 
    return $x * fac($x - 1); 
    } 

    xdebug_stop_trace(); 

?> 

跟蹤文件輸出:

TRACE START [2007-10-26 12:18:48] 
    0.0068  53384  -> fac() C:\www\fac.php:5 
    0.0069  53584  -> fac() C:\www\fac.php:10 
    0.0069  53840   -> fac() C:\www\fac.php:10 
    0.0070  54096   -> fac() C:\www\fac.php:10 
    0.0070  54376    -> fac() C:\www\fac.php:10 
    0.0071  54656    -> fac() C:\www\fac.php:10 
    0.0072  54936     -> fac() C:\www\fac.php:10 
    0.0072  55216     -> fac() C:\www\fac.php:10 
    0.0073  55392  -> xdebug_stop_trace() C:\www\fac.php:13 
    0.0237  55392 
TRACE END [2007-10-26 12:18:48] 
+0

謝謝,但我沒有使用IDE。代碼在遠程服務器上運行,我無法在本地進行鏡像。因此,我正在使用SSH進行VIM中的編輯。 – dotancohen

+0

你可以[遠程運行xdebug](http://xdebug.org/docs/remote),Netbeans是免費的。這裏沒有任何藉口:) – AlienWebguy

+0

我明白了,謝謝!現在我只需要說服主人讓我安裝它。謝謝! – dotancohen

2

退房的debug_backtrace功能 - 這應該始終可用,甚至在生產服務器上。

+0

OP具體說,debug_backtrace與他所需要的完全相反。 – AlienWebguy

+0

問題是我不知道代碼在哪個文件中運行。這正是我想弄明白的! – dotancohen

+0

那麼再打個電話來調試所有文件中的backtrace!在活動服務器上安裝調試擴展是非常愚蠢的,如果不允許重新啓動Apache,則不可能。 – Robin

1

您也可以使用apd擴展;這將爲每個請求寫一個文件,其中包含請求期間調用PHP函數的日誌。

+0

非常好,謝謝! – dotancohen

+0

但是,第二個看起來好像這個擴展需要程序員已經知道代碼在哪個文件中運行。這與我所需要的完全相反。 – dotancohen

+1

不一定;一旦你調用'apd_set_pprof_trace',每個後續函數調用都被擴展記錄。如果你在請求中充分提前調用了這個調用(例如,通過在你的'.htaccess'文件中使用'auto_prepend_file'指令),你應該能夠找到代碼中最後的位置 –

1

phptrace是跟蹤PHP代碼執行的真棒和簡單的工具,你可以試試。

0

來跟蹤特定功能的來源,你可以這樣做:

$reflFunc = new ReflectionFunction('function_name'); 
print $reflFunc->getFileName() . ':' . $reflFunc->getStartLine(); 

How to find out where a function is defined?

來跟蹤特定類的起源,你可以這樣做:

$reflClass = new ReflectionClass('class_name'); 
print $reflClass->getFileName() . ':' . $reflClass->getStartLine(); 

要獲得進入製作頁面的所有內容的列表,請執行以下操作:

var_dump(get_included_files()); 

爲了得到一組在頁面上定義的所有功能的列表,你可以這樣做:

var_dump(get_defined_functions()); 

要得到網頁上的所有用戶定義的函數的列表,你可以做這個:

$defined_functions = get_defined_functions(); 
var_dump($defined_functions["user"]); 
+0

這個答案不是解決被問到的問題,而是解決標題的一種可能的解釋。我沒有downvoted,因爲它包含有用的信息,但這個問題頁面不是它的地方。歡迎來到堆棧溢出! – dotancohen

+0

我感謝你不downvoting。在我的辯護中,問題是:「是否有任何方法可以對PHP進行堆棧跟蹤,以記錄運行時生成頁面的所有代碼?...一個簡單的include()層次結構的文件,用於生成頁面就足夠了。「這個問題的第二部分由get_included_files()回答。這不會返回層次數組,只是一個數值數組,但這是我所知道的最接近的解決方案。關於「記錄所有代碼」的問題的第一部分是模棱兩可的,但我認爲這意味着所有的功能和方法,而我的答案的另一部分。 – kloddant

+0

另外,OP說:「debug_backtrace函數與我需要的完全相反。」 debug_backtrace函數的對面是我答案的第一部分。 – kloddant