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,如果电路的多个阶段有多个事件,我需要使用几个钩子吗?

4

2 回答 2

1

使用堆栈索引 101 注册您的插件。在 routeShutdown 和 postDispatch 上检查响应对象中的异常。

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

要检查是否在错误处理程序循环中引发了异常,您必须将 dispatch() 放在 try-catch 块中

于 2011-03-20T00:25:32.420 回答
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);
        }
    }
}

注意,如果你使用 $response->getException(),你会得到一个 Zend_Exception 实例数组。在我理解了这一点之后,我只是在我的 logger 方法中添加了一个 foreach 循环,该循环将每个 Exception 分别写入日志。

现在几乎一切都按预期工作。目前我仍然记录了两个相同的异常,这不是我所期望的。我将不得不通过关于 SO 的另一个问题进行调查。

于 2011-03-20T15:07:43.257 回答