2011-07-09 46 views
1

問體面的想法這一點:如何使用回溯追蹤失敗的文件夾雜?

我想實現在PHP代碼中的一些機制,可以運行任何外部代碼,如果夾雜物的一個失敗其中(includerequire調用回調函數+ *_once)。

外部代碼意味着正在執行的代碼不是由我編寫的,也沒有對它的控制權。它包含在測試中。因此,詳細瞭解夾雜物故障更深入是有幫助的。

我正在運行的問題,它看起來不可能有一個PHP的致命錯誤發生時的回調。

我試過到目前爲止:

  • 通過set_error_handler註冊錯誤處理 - 不帶致命錯誤工作。
  • 使用__destruct()方法創建對象實例 - 未調用致命錯誤。
  • 已註冊關閉功能 - 不會對致命錯誤進行調用。

在任何這些我只是想獲取debug_backtrace,然後處理給出的信息。

所以問題很簡單:如何從PHP代碼中跟蹤失敗的文件包含,然後調用一個函數。

我擔心這個問題的答案是不是來自我最近的嘗試和搜索,所以任何有洞察力的高度讚賞。即使你的回答只會加強「不可能」的觀點。

此外,它是有幫助,以及是否有可能找出哪個文件是將被列入,包含以前那麼創建調試輸出(失敗與否)至少可以完成。

備註:

  • 優選W/O擴展。但是如果存在的話,我也很想知道。
  • 外部代碼意味着正在執行的代碼不是由我編寫的,也沒有對它的控制權。它包含在測試中。因此,詳細瞭解夾雜物故障更深入是有幫助的。

相關:

+0

你不能,因爲一個失敗的需求總是會導致一個致命的錯誤,而一個致命的錯誤總是會停止你的代碼。跟蹤失敗包括但是會很容易。 – dqhendricks

+0

@dqhendricks:你讓我好奇。你有什麼想跟蹤失敗包括? – hakre

+1

創建一個自定義錯誤處理程序,檢查該特定錯誤的錯誤字符串。 – dqhendricks

回答

2

我的建議是未經檢驗的,這裏有一些事情要嘗試:

如果所需/含PHP文件類autoload可能是一個選項

function __autoload($class) 
{ 
    // try to load 
} 

如果你可以包裝需要在try catch塊設置錯誤處理程序使用異常/包括 可能也行: 更新:不工作:(

function exception_error_handler($errno, $errstr, $errfile, $errline) { 
    throw new ErrorException($errstr, $errno, 0, $errfile, $errline); 
} 
set_error_handler("exception_error_handler"); 

如果你需要測試的代碼可以在使用popen和Xdebug如果pclose回報你在一個單獨的進程中執行程序的命令行進行測試-1您庫侖d從xdebug解析回溯。

$cmd = 'php --php-ini path/php.ini file/to/run.php'; 
    $output = ''; 
    $popen = popen($cmd, 'rb'); 

    while (!feof($popen)) { 
     $output .= fread($popen, 4096); 
    } 

    if (pclose($popen) < 0) { 
     // error - parse $output for xdebug backtrace 
    } 
+0

我不認爲通過spl連接到自動加載鏈會揭示很多信息。對於不存在的類,它會被調用,但是不會顯示哪個文件將被包含。有問題的代碼並沒有明確地總是使用自動加載,所以它只會在某些條件下才能覆蓋。 'set_error_handler'是我已經嘗試過的東西。這個問題會更加突出。 – hakre

+0

如果代碼或測試代碼可以使用popen在命令行中運行,並且xdebug成爲可能的選項 –

+0

感謝您的更新。它確實在命令行中,將要開始的命令是PHPUnit。 PHPUnit中的xdebug get被禁用,但是,bootstrap.php可以啓用它。 Xdebug backtrace到目前爲止我正在研究,以及它提供了一個失敗的包括回溯。可以這麼說,在shell中暫時不需要將它包裝進fopen中。但感謝您的反饋,xdebug提供了回溯。 – hakre

0

你不需要它。加載類使用__autoload函數。要包含靜態文件,請使用require_once。要加載動態文件,您應該在使用(file_exeists,is_readable等)之前檢查它們,並在未找到回溯的文件時拋出異常。