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