2011-03-19 74 views
0

我正在構建一個監視解決方案,用於記錄PHP錯誤,未捕獲的異常以及用戶想要登錄到數據庫表的其他任何內容。 Zend Server中的監控解決方案的替代品。掛鉤到錯誤處理週期

我已經寫了一個擴展Zend_Log並可以處理所有提到的情況的Monitor類。 我的目標是將配置減少到一個地方,這將是Bootstrap。目前我正在初始化顯示器這樣的:

protected function _initMonitor() 
{ 
    $config = Zend_Registry::get('config'); 
    $monitorDb = Zend_Db::factory($config->resources->db->adapter, $config->resources->db->params); 

    $monitor = new Survey_Monitor(new Zend_Log_Writer_Db($monitorDb, 'logEntries'), $config->projectName); 

    $monitor->registerErrorHandler()->logExceptions(); 
} 

的registerErrorHandler()方法使PHP錯誤日誌記錄到數據庫中,logExceptions()方法是一個擴展,只是設置一個保護標誌。

在ErrorController errorAction我加入下面幾行:

//use the monitor to log exceptions, if enabled 
$monitor = Zend_Registry::get('monitor'); 

if (TRUE == $monitor->loggingExceptions) 
{ 
    $monitor->log($errors->exception); 
} 

我想避免添加代碼到ErrorController不過,我寧願動態註冊一個插件。這將使用戶更容易集成到現有項目中。

問題:我可以註冊一個使用postDispatch掛鉤的控制器插件並獲得相同的效果嗎?我不明白什麼事件觸發errorAction,如果在電路的多個階段有多個事件,我是否需要使用多個鉤子?

回答

0

通過Xerkus接受的答案讓我在正確的軌道上放置調度()。不過,我想補充一些關於我的解決方案的信息。

我寫了一個控制器插件,它看起來像這樣:

class Survey_Controller_Plugin_MonitorExceptions extends Zend_Controller_Plugin_Abstract 
{  
    public function postDispatch(Zend_Controller_Request_Abstract $request) 
    { 
     $response = $this->getResponse(); 
     $monitor = Zend_Registry::get('monitor'); 

     if ($response->isException()) 
     { 
      $monitor->log($response); 
     } 
    } 
} 

注意:如果使用$響應 - 你得到Zend_Exception異常實例的Array> getException()。在我理解了這一點之後,我簡單地向記錄器方法添加了一個foreach循環,將每個異常寫入單獨記錄。

現在幾乎所有的東西都按預期工作。目前我仍然得到兩個相同的異常記錄,這不是我所期望的。我將不得不通過另一個關於SO的問題來看看。

+0

您可以在插件中存儲異常,並檢查存儲的堆棧和響應堆棧是否相同。然後跳過處理。 – Xerkus 2011-03-20 19:03:45

1

向堆棧索引101註冊您的插件。檢查routeShutdown和postDispatch上的響應對象中的異常。

$response = $this->getResponse(); 
if ($response->isException()) { 
    $exceptions = $response->getException(); 
} 

檢查是否異常被錯誤處理程序循環內拋出你必須在try-catch塊

+0

到目前爲止感謝。請介紹一下你的答案的第一部分與最後一句的關係。我現在還不知道。 – markus 2011-03-20 12:11:01

+0

不應該$ responce-> getException()返回一個Zend_Exception的實例嗎?它沒有。相反,它返回一個數組,我不能使用getMessage()等。奇怪的!? – markus 2011-03-20 13:23:36

+0

好吧,看來$ responce-> getException()會在數組中返回一堆異常。 – markus 2011-03-20 13:35:31