在 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

此致, 能量球

你不应该在 index.php 中这样做。你正在污染你的索引文件。例如,您可以制作一个记录器服务。环境变量可通过以下方式在应用程序中使用:

$currentEnvironment = getenv('APPLICATION_ENV');

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

Zend Framework 2 手册中有一章Advanced Configuration Tricks with a paragraph Environment-specific system configuration。在那里您可以看到有关如何使用环境变量来设置应用程序错误处理的其他示例。

函数set_error_handler("bszErrorHandler", E_ERROR)不需要调用。您需要在出现错误时触发它。但它仅用于用户定义的误差函数。此功能是您仅在 E_USER_ERROR 时收到邮件而不是在真正的异常或致命错误时收到邮件的原因。