我无法在短时间内关闭已弃用的警告。它们来自一个垃圾堆脚本,我被迫工作了一段时间,其中它们过度使用带有 /e 修饰符的 preg_replace 。与其去修复所有执行此操作的地方,在我处理此问题时关闭已弃用的警告似乎是一个更好的主意。
奇怪的是,问题在于脚本开头的 error_reporting 函数似乎只有“开/关”效果。也就是说,我可以使用
error_reporting(0)
完全关闭报告,并且可以使用 error_reporting(E_ALL)
之类的功能将其全部打开。但使用以下任何选项都没有影响。我的页面顶部仍然收到 100 多个已弃用的警告。
<?php
error_reporting(E_ALL ^ E_DEPRECATED);
error_reporting(E_ALL & ~E_DEPRECATED);
error_reporting(E_ALL & ~E_NOTICE & ~E_DEPRECATED);
我已经验证我的 php.ini 文件设置为
E_ALL & ~E_DEPRECATED)
(24575),并且它在 phpinfo() 中显示为这样。项目根目录中的 .htaccess 文件为空。为什么会有一个,我不知道。
PHP 5.5.9-1ubuntu4.4
有什么想法吗?
我想说可能还有另一个页面或脚本正在将 error_reporting 设置为不同的值。您可以不带参数调用
error_reporting()
来获取当前值。将其设置为某个值并检查在包含其他文件后该值没有改变。
error_reporting(E_ALL | E_STRICT);
只是说“嘿,记录这些类型的错误/警告/通知”
我想你会需要 -
ini_set('display_errors', '0');
尝试一下。
解决方案:
ini_set("display_errors",'off');
在您的 php 脚本中使用它。它将隐藏页面中出现的警告。
Other interesting options for that function:
<?php
// 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);
// For PHP >=5.3 use: 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);
?>
我来得太晚了,但我不止一次看到这个问题,并最终找到了这里尚未列出的问题。在我的设置中,我使用 CarbonPHP 将 全局错误/异常处理程序附加到进程中;我是完整披露的作者。下面是 WordPress 初始化期间的浏览器输出。我们看到
E_DEPRECATED
被抛出,即使它不在我们应该捕获的错误列表中。该列表是在处理函数发生错误时生成的。这里的关键实际上在 PHP 内部全局异常处理程序的文档中的第一个示例中。
这是该示例的开始片段。
// error handler function
function myErrorHandler($errno, $errstr, $errfile, $errline)
{
if (!(error_reporting() & $errno)) {
// This error code is not included in error_reporting, so let it fall
// through to the standard PHP error handler
return false;
}
// $errstr may need to be escaped:
$errstr = htmlspecialchars($errstr);
switch ($errno) {
case E_USER_ERROR:
echo "<b>My ERROR</b> [$errno] $errstr<br />\n";
echo " Fatal error on line $errline in file $errfile";
echo ", PHP " . PHP_VERSION . " (" . PHP_OS . ")<br />\n";
echo "Aborting...<br />\n";
exit(1);
case E_USER_WARNING:
echo "<b>My WARNING</b> [$errno] $errstr<br />\n";
break;
case E_USER_NOTICE:
echo "<b>My NOTICE</b> [$errno] $errstr<br />\n";
break;
default:
echo "Unknown error type: [$errno] $errstr<br />\n";
break;
}
/* Don't execute PHP internal error handler */
return true;
}
第一个 if 语句表明,无论报告级别如何,所有错误都将被抛出到全局处理程序。看来你有责任根据级别过滤掉不需要的错误。
恕我直言,一方面,在不需要时调用全局处理程序会产生开销。尽管如此,由于任何插件/方法都可以更改错误级别,从而导致全局更改,因此尽管当前设置了错误级别,您仍然可以回到原来的意图。这非常有用,值得为您的项目进行设置。