如何抑制 codeigniter 中的通知错误?

问题描述 投票:0回答:6

我想在某个 cronjob 期间抑制 codeigniter 错误日志中的通知。我尝试在行前面使用@,但它仍然在日志中打印通知:

这是生成通知的行:

@$resultarray[1][2]++;

通知:... 严重性:通知 --> 未定义偏移量:1 ...

我在这里做错了什么?

(我使用它经过深思熟虑,所以请不要留言声称不使用@,谢谢:))

php codeigniter
6个回答
8
投票

要让 PHP 报告除 E_Notice 之外的所有错误,请像这样调用 PHP error_reporting 函数:

error_reporting(E_ALL & ~E_NOTICE);

我相信最好的方法是在应用程序的根目录配置你的index.php,首先检测你的应用程序环境,然后有条件地设置报告哪些PHP错误。

index.php

if (defined('ENVIRONMENT'))
{
  switch (ENVIRONMENT)
  {
    case 'development':
    case 'testing':
    case 'staging':
      error_reporting(E_ALL & ~E_NOTICE);
    break;

    case 'production':
      error_reporting(0);
    break;

    default:
      exit('The application environment is not set correctly.');
  }
}

有关 error_reporting 函数的更多配置选项,请参阅官方 PHP 文档

或者,您可以在您正在使用的特定文件中调用 error_reporting 函数(无论您的 cron 作业调用什么),它会用您在 index.php 中设置的内容覆盖配置。这是一个使用控制器的简单示例:

class Sample_Controller extends CI_Controller {

  public function __construct()
  {
    parent::__construct();
    error_reporting(E_ALL & ~E_NOTICE);
  }

}

3
投票

在系统/core/Common.php中

function _exception_handler($severity, $message, $filepath, $line)
{
     // We don't bother with "strict" notices since they tend to fill up
     // the log file with excess information that isn't normally very helpful.
     // For example, if you are running PHP 5 and you use version 4 style
     // class functions (without prefixes like "public", "private", etc.)
     // you'll get notices telling you that these have been deprecated.
    if ($severity == E_STRICT || !error_reporting()) // <-- add || !error_reporting()
    {
        return;
    }

    $_error =& load_class('Exceptions', 'core');

    // Should we display the error? We'll get the current error_reporting
    // level and add its bits with the severity bits to find out.
    if (($severity & error_reporting()) == $severity)
    {
        $_error->show_php_error($severity, $message, $filepath, $line);
    }

    // Should we log the error?  No?  We're done...
    if (config_item('log_threshold') == 0)
    {
        return;
    }

    $_error->log_exception($severity, $message, $filepath, $line);
}

}

添加

|| !error_reporting()
和带有错误控制运算符
@
的表达式将不会被 CodeIgniter 记录。


0
投票

直接来自文档

<?php

// Turn off all error reporting
error_reporting(0);

// Report simple running errors
error_reporting(E_ERROR | E_WARNING | E_PARSE);

// Reporting E_NOTICE can be good too (to report uninitialized
// variables or catch variable name misspellings ...)
error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);

// Report all errors except E_NOTICE
// This is the default value set in php.ini
error_reporting(E_ALL ^ E_NOTICE);

// Report all PHP errors (see changelog)
error_reporting(E_ALL);

// Report all PHP errors
error_reporting(-1);

// Same as error_reporting(E_ALL);
ini_set('error_reporting', E_ALL);

?>

在你的 php.ini 中注释掉,

error_reporting = E_ALL & ~E_NOTICE
error_reporting = E_ALL & ~E_NOTICE | E_STRICT
error_reporting = E_COMPILE_ERROR|E_RECOVERABLE_ERROR|E_ER… _ERROR
error_reporting = E_ALL & ~E_NOTICE

0
投票

来自 http://php.net/manual/en/language.operators.errorcontrol.php

如果您使用 set_error_handler() 设置了自定义错误处理函数 那么它仍然会被调用,但是这个自定义错误处理程序可以(并且 应该)调用 error_reporting() ,当调用该方法时,它将返回 0 触发错误之前有@。

但是,CodeIgniter 2 不这样做。为了从 CodeIgniter 中隐藏 @suppressed 错误,您需要编辑

_exception_handler
中的
system/core/Common.php
函数,以在开头包含这些行:

if (error_reporting() == 0) {
  return;
}

根据上面的链接,如果触发错误的调用前面有 @,则

error_reporting()
将返回 0。此代码将检查这一点,并防止 CodeIgniter 记录此类错误。


0
投票

转到配置/常量然后设置 定义('SHOW_DEBUG_BACKTRACE')或定义('SHOW_DEBUG_BACKTRACE',TRUE);到 定义('SHOW_DEBUG_BACKTRACE')或定义('SHOW_DEBUG_BACKTRACE',FALSE);


0
投票

对于仍然支持遗留 PHP/CodeIgniter(旧版本) 项目的人,请继续阅读以获取正确的修复:

编辑

system/core/Common.php
以及
system/codeigniter/Common.php

替换这个:

    // Should we display the error? We'll get the current error_reporting
    // level and add its bits with the severity bits to find out.
    if (($severity & error_reporting()) == $severity)
    {
            $_error->show_php_error($severity, $message, $filepath, $line); 
    }

这样:

    // Should we display the error? We'll get the current error_reporting
    // level and add its bits with the severity bits to find out.
    if (($severity & error_reporting()) == $severity)
    {
        if (str_ireplace(array('off', 'none', 'no', 'false', 'null', '0'), '', ini_get('display_errors')))
        {
            $_error->show_php_error($severity, $message, $filepath, $line); 
        }
    }

现在将其设置为标准 .php 方式(或者也可以使用 .htaccess 等配置文件):

ini_set('display_errors','0');

详细信息:我只是添加了较新版本中的部分,并且还添加了“0”检查。这使得依赖配置/用户设置的

display_errors
来决定是否需要显示错误!

© www.soinside.com 2019 - 2024. All rights reserved.