我想在某个 cronjob 期间抑制 codeigniter 错误日志中的通知。我尝试在行前面使用@,但它仍然在日志中打印通知:
这是生成通知的行:
@$resultarray[1][2]++;
通知:... 严重性:通知 --> 未定义偏移量:1 ...
我在这里做错了什么?
(我使用它经过深思熟虑,所以请不要留言声称不使用@,谢谢:))
要让 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);
}
}
在系统/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 记录。
直接来自文档
<?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
来自 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 记录此类错误。
转到配置/常量然后设置 定义('SHOW_DEBUG_BACKTRACE')或定义('SHOW_DEBUG_BACKTRACE',TRUE);到 定义('SHOW_DEBUG_BACKTRACE')或定义('SHOW_DEBUG_BACKTRACE',FALSE);
对于仍然支持遗留 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
来决定是否需要显示错误!