2013-06-26 55 views
0

一旦我啓動了一個函數,我將在DB上設置一個標記爲TRUE對錯誤執行函數php

,我需要將其設置FALSE在函數的結束。

例:

Class Preprocessor extends Machine{ 

    function process(){ 
    $this->db->setValue(TRUE); //Setting DB flag to TRUE 

    //OTHER CODES 

    $this->close_db_value(); // Setting DB flag to FALSE 

    } 

    function close_db_value(){ 
    $this->db->setValue(FALSE); //Setting DB flag to FALSE 
    } 

} 

正如你可以看到它在正常情況下工作,但如果//其他代碼段遇到了一些錯誤,那麼它不會執行代碼的其餘部分。

的功能主要工作在後臺(而不是作爲一個命令行,它只是關閉連接,並開始在後臺執行)。

我怎樣才能確保close_db_value()函數在腳本執行的終止?

一些可能性

  1. 是導致腳本終止
  2. exit上//其他代碼部分地方叫
  3. PHP max_execution_time超過
  4. 力殺
  5. 一些嚴重錯誤

請幫忙。

+1

無論是否存在致命錯誤,try {...} finally {...}塊總是應該執行finally塊。我不知道它是否會在後三種情況下執行。參見[文檔](http://php.net/manual/en/language.exceptions.php)。 – Sumurai8

+0

@ Sumurai8它不是,最後一個是有問題的。事實是腳本可能會在後臺運行大約1小時,而我的託管提供商不會這樣。 :) – Red

回答

1

在PHP中使用函數。將發生錯誤時要調用的回調函數的名稱作爲第一個參數。將您想要的錯誤級別(可選)作爲觸發器作爲第二個參數。

如果您正在尋找處理所有其他類型的錯誤(除非SIGKILLs或強制退出),你也可以嘗試使用register_shutdown_function()一個error_get_last()和一個開關case語句與要處理各種錯誤類型(E_NOTICE ,E_DEPRECATED等)。

例如,

register_shutdown_function('shutdown_callback'); 

function shutdown_callback(){ 
    $error_type = error_get_last(); 
    switch($error_type){ 
     case E_ERROR: break; 
     case E_WARNING: break; 
    } 
} 
+0

'以下錯誤類型不能用用戶定義的函數處理:E_ERROR,E_PARSE,E_CORE_ERROR,E_CORE_WARNING,E_COMPILE_ERROR,E_COMPILE_WARNING和調用set_error_handler()時調用的文件中引發的大部分E_STRICT .' – Red

+0

@Red I just修改了我的答案,在做了一些輕微的研究之後,還添加了另一種方法。此外,'register_shutdown_function()'的文檔指定了如何處理SIGTERM/SIGKILL,如果你需要處理的話,但我從來沒有打擾過。 – BLaZuRE

+0

謝謝,但事實上,我可以處理前兩個列出的可能終止'register_shutdown_function()'將超過超時時間將失敗。是否有任何系統(OS)級解決方案? – Red

0

__destruct();魔功能也將執行每一腳本結束,或一個對象被卸載時間。

+0

謝謝,但在我的情況下,它不會工作。 – Red