Zend 2应用程序中通过邮件报告错误


Error Reporting via Mail in a Zend 2 Application

我正在定制一个名为VuFind的大型Zend 2应用程序。对于我们的生产系统,我希望通过邮件报告错误。我创建了一个文件error_reporting.php,它包含在顶部的index.php中(在Zend2内容之前)

require_once('error_reporting.php');

以下是此文件中最重要的内容。我省略了函数parseErrorNo(),因为它只是一种显示方法。

<?php
//DEV Mode
if(APPLICATION_ENV == 'development') {
    ini_set('display_errors', true);
    ini_set('display_startup_errors', true);
    error_reporting(E_ALL );    
}
//Testing
elseif(APPLICATION_ENV == 'test') {
    ini_set('display_errors', true);
    ini_set('display_startup_errors', true);
    error_reporting(E_ALL - E_NOTICE );    
}
//Production mode
else {
    ini_set('display_errors', false);
    ini_set('display_startup_errors', false);
    ini_set('log_errors', true);
    ini_set('error_log', '/var/log/vufind.log');
    error_reporting(0);
}
set_error_handler("bszErrorHandler", E_ERROR);
/**
 * Send mail  to admins
 * @param int $errNo
 * @param string $errStr
 */
function bszErrorHandler($errNo, $errStr) {
    $recipients = [
        'my@mail.de',
    ];
    $host = $_SERVER['HTTP_HOST'];
    $subject = 'Error on '.$host.': '.utf8_decode($errStr);
    $error = error_get_last();
    $file = isset($error) ? $error['file'] : '';
    $line = isset($error) ? $error['line'] : '';
    $msg = isset($error) ? $error['message'] : '';
    $message = [
        'Error Code: '.parseErrorNo($errNo), 
        'Query String: '.$_SERVER['QUERY_STRING'],
        'Remote Addr: '.$_SERVER['REMOTE_ADDR'],
        'Server Port: '.$_SERVER['SERVER_PORT'],
        'User Agent: '.$_SERVER['HTTP_USER_AGENT'],
    ];
    if(isset($error)) {
        $message['file'] = $file;
        $message['line'] = $line;
        $message['message'] = $msg;
    }
    foreach ($recipients as $address) {
        mail($address, $subject, utf8_decode(implode("'n", $message)));
    }    
}

当我触发E_USER_*时,这是有效的,但当出现真正的异常或致命的PHP错误时,它就不起作用了。我想这是Zend的某个地方;也许是为了记录?但我找不到set_error_handler()的电话。AjaxController中只有一个调用,它不负责主应用程序。

VuFind的代码可以在这里看到https://github.com/vufind-org/vufind

谨致问候,powerriegel

函数set_error_handler("bszErrorHandler", E_ERROR)不需要调用。你需要用一个错误来触发它。但它只用于用户定义的错误函数。此功能是您仅在E_USER_ERROR上接收邮件的原因,而不是在真正的异常或致命错误上。

您不应该在index.php中执行此操作。您正在污染索引文件。例如,您可以创建一个记录器服务。应用程序中的环境变量可通过以下途径获得:

$currentEnvironment = getenv('APPLICATION_ENV');

您也可以使用您的视图管理器配置来打开和关闭异常

在Zend Framework 2手册中,有一章高级配置技巧,其中有一段特定于环境的系统配置。在那里,您可以看到关于如何使用环境变量设置应用程序错误处理的其他示例。