PHP error_reporting 打开或关闭

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

我无法在短时间内关闭已弃用的警告。它们来自一个垃圾堆脚本,我被迫工作了一段时间,其中它们过度使用带有 /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

有什么想法吗?

php error-reporting
5个回答
2
投票

我想说可能还有另一个页面或脚本正在将 error_reporting 设置为不同的值。您可以不带参数调用

error_reporting()
来获取当前值。将其设置为某个值并检查在包含其他文件后该值没有改变。


0
投票
error_reporting(E_ALL | E_STRICT); 

只是说“嘿,记录这些类型的错误/警告/通知”

我想你会需要 -

ini_set('display_errors', '0');

尝试一下。


0
投票

解决方案:

ini_set("display_errors",'off');

在您的 php 脚本中使用它。它将隐藏页面中出现的警告。


0
投票
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);

?>

0
投票

我来得太晚了,但我不止一次看到这个问题,并最终找到了这里尚未列出的问题。在我的设置中,我使用 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 语句表明,无论报告级别如何,所有错误都将被抛出到全局处理程序。看来你有责任根据级别过滤掉不需要的错误。

恕我直言,一方面,在不需要时调用全局处理程序会产生开销。尽管如此,由于任何插件/方法都可以更改错误级别,从而导致全局更改,因此尽管当前设置了错误级别,您仍然可以回到原来的意图。这非常有用,值得为您的项目进行设置。

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