在我捕获所有PHP错误的项目中,我已经设置了我的错误处理机制,如下所示:
error_reporting()的index.php文件,该文件将覆盖任何东西的php.ini文件 system/codeigniter/CodeIgniter.php使用
set_error_handler-这个错误处理程序,_exception_handler在被发现system/codeigniter/Common.php_exception_handler函数忽略E_STRICT错误,调用
show_php_error如果你指定的严重性功能从异常系统库error_reporting()中的函数
index.php根据不管你已经在你的设置和记录错误config.php文件FALSE后,PHP继续处理错误,但通常会根据您的error_reporting级别和display_errors设置.令我困惑的是,E_ERROR错误即致命错误似乎根本没有被抓住_exception_handler.这不仅仅是show_php_error没有被调用,看起来这个函数并没有被调用.这显然是一个问题,因为这意味着它们不会被处理show_php_error或记录.例如,如果我故意$this->load->views('foo');在控制器中输入错误,则不会调用处理程序.
任何关于错误处理的建议都将非常感谢,谢谢!
现在这是一个相当大的争论:你是否应该抓住致命的错误.有人说它们是致命的,所以你不知道系统在哪种条件下,但我会选择"如果发生错误就尝试清理".为了捕获所有致命错误,您需要设置pre_system挂钩.转到application/config/hooks.php并输入
$hook['pre_system'][] = array(
'class' => 'PHPFatalError',
'function' => 'setHandler',
'filename' => 'PHPFatalError.php',
'filepath' => 'hooks'
);
Run Code Online (Sandbox Code Playgroud)
之后转到hooks目录并添加您对错误的处理:
<?php
class PHPFatalError {
public function setHandler() {
register_shutdown_function('handleShutdown');
}
}
function handleShutdown() {
if (($error = error_get_last())) {
ob_start();
echo "<pre>";
var_dump($error);
echo "</pre>";
$message = ob_get_clean();
sendEmail($message);
ob_start();
echo '{"status":"error","message":"Internal application error!"}';
ob_flush();
exit();
}
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,我们正在使用register_shutdown_function来运行一个函数,该函数检查是否发生了错误,以及是否已通过电子邮件将其发送给开发人员.这个设置在我一直与之合作的几个CI项目中完美地工作了两年多.
| 归档时间: |
|
| 查看次数: |
18870 次 |
| 最近记录: |