gpt4 book ai didi

php - codeigniter 中的错误处理

转载 作者:可可西里 更新时间:2023-11-01 12:19:20 26 4
gpt4 key购买 nike

在我的项目中,为了捕获所有的 PHP 错误,我设置了如下错误处理机制:

  1. 我在 index.php 文件中设置了 error_reporting() 覆盖php.ini 文件中的任何内容
  2. 错误处理程序在 system/codeigniter/CodeIgniter.php 中使用set_error_handler - 这个错误处理程序,_exception_handler,是在 system/codeigniter/Common.php
  3. 中找到
  4. _exception_handler 函数忽略 E_STRICT 错误,调用show_php_error 函数 来自 Exceptions 系统库,如果严重性是由您的 error_reporting() 函数指定的index.php 并根据您在 config.php 文件中设置的内容记录错误
  5. 处理程序返回 FALSE 所以在此 PHP 继续处理之后错误,但通常会根据您的 error_reporting 级别和 display_errors 设置。

令我困惑的是 E_ERROR 错误,即 fatal error 似乎根本没有被 _exception_handler 捕获。不仅仅是 show_php_error 没有被调用,看起来函数只是没有被调用。这显然是一个问题,因为这意味着它们不会被 show_php_error 处理或记录。例如,如果我在 Controller 中故意输入错误的 $this->load->views('foo');,则不会调用处理程序。

任何关于错误处理的建议将不胜感激,谢谢!

最佳答案

现在这是一场相当大的辩论:您是否应该捕获 fatal error 。有人说它们是致命的,所以您不知道系统处于哪种状态,但我会继续“如果发生错误,请尝试进行清理”。为了捕获所有 fatal error ,您需要设置一个 pre_system Hook 。转到 application/config/hooks.php 并输入

$hook['pre_system'][] = array(
'class' => 'PHPFatalError',
'function' => 'setHandler',
'filename' => 'PHPFatalError.php',
'filepath' => 'hooks'
);

之后转到 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();
}
}

如您所见,我们正在使用 register_shutdown_function 来运行一个函数,该函数检查是否发生错误以及是否已通过电子邮件将错误发​​送给开发人员。在我参与的多个 CI 项目中,此设置已完美运行超过 2 年。

关于php - codeigniter 中的错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14778377/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com