2011-08-30 31 views
4

如何測試在PHP中的關閉函數中是否退出是乾淨的?如何在PHP中關閉函數時檢查exit是否乾淨?

通過清潔退出我的意思是劇本沒有結束因一個錯誤。

+5

你是什麼意思「退出是乾淨的」? –

+0

「乾淨的退出」你的意思是關閉功能應該檢查腳本是否結束,因爲它達到了的代碼,而不是因爲它遇到了一個錯誤? –

+0

有趣的是,我打打鬧鬧試圖拿出東西來回答這個神祕的問題,我發現'debug_backtrace()'不會調用時跟蹤超出註冊關機功能在它之內。 – Dan

回答

6

它是一個很好的問題,目前我唯一有此想法:註冊一個關機功能是這樣的:

function shutdown() { 
    if (defined('END_REACHED') { 
     echo 'Script executed with no error', PHP_EOL; 
    } 
} 

register_shutdown_function('shutdown'); 

隨着auto_append_file添加一個額外的文件,每一個腳本執行的最末端,其設置一個常數。

你auto_append_file.php內容:

define('END_REACHED', TRUE); 

如果你不想編輯你可以做的php.ini檢查您的註冊關機功能error_get_last()$php_errormsg

+0

+1,但如果可能的話,我寧願選擇不需要php.ini修改的解決方案。 – agsamek

+1

'auto_append_file'也可以用.htaccess修改。 – powtac

+0

我不明白爲什麼這會你有什麼建議 - 除非你有條件包括將在隱式主要適用範圍要處理的文件,因此定義將立即生效代碼解析 - 執行完成不是當 - 和什麼區別在使用包含構造和設置內聯標誌/定義之間? – symcbean

0

有很多原因腳本可能提前終止。沒有通用的解決方案。導致腳本過早終止的唯一錯誤是致命錯誤 - 在大多數情況下,關閉函數在致命錯誤後不會運行,類似地,自定義錯誤處理程序只會可靠地看到非致命錯誤。然後可以選擇設置信號處理程序 - 但他們只能看到一些故事。

當然最大的問題是你想在做什麼這個信息在關機功能中?

的唯一可靠的方法來確定你的邏輯完成預期的是提高信號發生這種情況時,並檢查它在關機功能。

0

我移植(對於PHP 5.3),它很好地處理這個ezcExecution組件。見https://github.com/sobstel/Execution。基本上你需要通知lib出口是乾淨的(通過調用Execution :: cleanExit()。否則就意味着退出並不乾淨)簡單。

1

調用error_get_last()可以告訴你是否發生了錯誤。該函數返回NULL,這是一個乾淨的關閉。