2011-11-15 177 views
7

這是一個很遠的鏡頭,但我想我會問無論如何。我有一個基於Web的代碼編輯的應用程序,就像你在Github上使用ACE編輯器一樣。問題是,可以編輯應用程序本身內的代碼。PHP測試致命錯誤

在保存文件之前,我已經設法檢測到分析錯誤,這很好,但是如果用戶創建運行時錯誤(如MyClass extends NonExistentClass),文件會通過解析檢查,但會保存到文件系統,從而導致應用程序無法正常使用。

是否有無論如何測試新代碼是否會導致運行時錯誤,然後將其保存到文件系統?似乎完全違反直覺,但我想我會問。

+0

哇。這是我在這個網站上看到的最好的問題之一。我會期待自己的回答。也許有一些與'eval()'值得檢查。 –

回答

2

可能使用register_shutdown_function來構建包含有關致命錯誤信息的JSON對象。然後使用AJAX調用來測試該文件;解析來自調用的返回值以查看是否有錯誤。 (當然你也可以運行PHP文件,並解析JSON對象,而無需使用AJAX,只是想着這將是最好的從UX的角度來看)

function my_shutdown() { 
    $error = error_get_last(); 
    if($error['type'] == 1) { 
     echo json_encode($error); 
    } 
} 
register_shutdown_function('my_shutdown'); 

將輸出類似

{"type":1,"message":"Fatal error message","line":1} 

前置那到開始的測試文件,那麼:

$.post('/test.php', function(data) { 
    var json = $.parseJSON(data); 
    if(json.type == 1) { 
     // Don't allow test file to save? 
    } 
}); 
+0

喜歡它。謝謝。 – UncleCheese

+0

未經過測試,因此無法保證它能正常工作......我會暫時將問題留待其他人看看。 – andrewtweber

0

也許先在單獨的文件中運行代碼並在底部附上一些固定代碼以檢查它是否評估?

2

可能有用:如果存在運行時錯誤,則php -f <file>將返回非零退出代碼。