2011-03-19 71 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