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

标签 php error-handling zend-framework2

我正在定制一个名为 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

问候,
权力里格尔

最佳答案

函数set_error_handler("bszErrorHandler", E_ERROR)不需要调用。您需要通过错误触发它。但它只用于用户定义的误差函数。此功能是您仅在 E_USER_ERROR 上接收邮件的原因不是真正的异常或 fatal error 。

关于php - 在 Zend 2 应用程序中通过邮件报告错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33953093/

相关文章:

python - 记录和引发异常

zend-framework2 - Zend Framework 2中,如何在 Controller 外使用 Controller 插件

http-headers - 通过 Zend 下载 excel 文件

php - 如何在 Laravel 5.2 中使用 Prepared Statement

php - mysql 最后 5 个倒序?

language-agnostic - 错误处理。一个程序应该怎么做?

c++ - 处理模板方法中的错误

php - 如何对 mysql_query 进行精确匹配?

PHP isset 不适用于空

zend-framework2 - ZF2 Controller 插件