【问题标题】:How do I turn off PHP Notices?如何关闭 PHP 通知?
【发布时间】:2011-02-21 11:06:39
【问题描述】:
Notice: Constant DIR_FS_CATALOG already defined

我已经在php.ini 中注释掉了display_errors,但是没有用。

如何让 PHP 不向浏览器输出此类内容?

更新

我把display_errors = Off放在那里,但它仍在报告此类通知,

这是 PHP 5.3 的问题吗?

还报告了许多 调用堆栈..

【问题讨论】:

  • 如果您使用的是 Apache,您可能需要重新启动服务器!如果您使用的是 XAMPP,只需在管理器应用中选择“重新启动”即可。
  • 我建议运行grep display_errors /path/to/php.ini 以查看您的行是否在文件中的某处被覆盖。这就是发生在我身上的事情。
  • Error_reporting 是解决方案
  • 在你的 php 文件中尝试ini_set('display_errors',0)。当您的 ini 设置不起作用时,您应该检查 phpinfo() 是否显示您想要的值。如果不是,您要么更改了错误的 ini 文件,要么覆盖了 php.ini 中的值
  • 这不是 php 5.3 的错误。 display_errors 适用于 php 4.0.3 到最新版本@see 3v4l.org/87gIl

标签: php error-handling constants


【解决方案1】:

来自 PHP 文档 (error_reporting):

<?php
// Turn off all error reporting
error_reporting(0);
?>

该功能的其他有趣选项:

<?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);

?>

【讨论】:

  • 非常有帮助,并给出了问题的答案。虽然我知道最好也修复所有通知。有时显示除通知之外的所有内容会很方便。
  • 使用上面帖子中所述的 ^ NOTICE 仅关闭通知对我不起作用。对于 PHP v5.3 使用:E_ALL & ~E_NOTICE
  • 如果您有一个返回 JSON 或 XML 或其他内容的 REST API,您可能需要关闭这些。或者至少将它们转换为异常并相应地处理它们。
  • Display_errors 控制是否将错误发送到标准输出。但是,当您将 error_reporting 更改为 0 时,您将完全禁用所有错误处理和错误日志记录。您永远不应该执行 error_reporting(0)。
【解决方案2】:

您可以将display_errors 设置为0 或使用error_reporting() 函数。

但是,通知很烦人(我可以partly sympathize),但它们是有目的的。你不应该定义一个常数两次,第二次将不起作用,常数将保持不变!

【讨论】:

  • +1:我赞成提到他应该纠正错误,而不是关闭报告。而且您以比@Jonathan Kuhn 更温和的方式做到了:-)
  • 不,看来这是 php5.3 的错误,display_errors 没有按预期工作。
  • @user 尝试phpinfo() 以查看该设置是否实际适用。原谅我,但我强烈怀疑你在 PHP 5.3 中发现了一个错误 - 我只有在看到它时才会相信它:)
  • 奇怪,local value 开启,但master value 关闭,不知道这到底是什么意思……
  • @user 我认为本地值可以来自ini_set 指令或.htaccess 文件中的php_ini_flag 设置。
【解决方案3】:

对于命令行php,设置

error_reporting = E_ALL & ~E_NOTICE

/etc/php5/cli/php.ini

command php 执行然后忽略通知。

【讨论】:

  • 通过在 php.ini 中执行 error_reporting = E_ALL & ~E_NOTICE & ~E_WARNING。它禁用 PHP 通知和 PHP 警告。这样浏览器中就不会出现 php 通知和 php 警告
  • 这适用于控制台 php 设置。如果你使用php通过apache2生成网页,webserver配置文件是/etc/php5/apache2/php.ini 最好使用phpinfo()来查看实际使用的是什么配置文件。
【解决方案4】:
<?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
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);

?>

来源http://php.net/manual/en/function.error-reporting.php

【讨论】:

  • 这不只是几年前发布的this existing answer 的复制品吗?
  • 我们都从php文档中复制粘贴,两个答案都提到了资源。
  • @AbhishekGoel 独角兽是伪装的小马,那句话无关紧要,四年后你仍然重复already existing answer
  • @RickyB 我没有检查现有答案,也没有复制。
【解决方案5】:

在你的代码中使用了这一行

error_reporting(E_ALL ^ E_NOTICE);  

我认为它对你来说已经满满当当了。

【讨论】:

    【解决方案6】:

    我不想在我的代码中设置error_reporting。但在一种情况下,一个遗留产品,有太多的通知,必须隐藏它们。

    所以我使用以下 sn-p 来设置服务器端配置的值 error_reporting 但减去 E_NOTICEs。

    error_reporting(error_reporting() & ~E_NOTICE);
    

    现在可以在php.ini.htaccess 中进一步配置错误报告设置。只有通知将始终被禁用。

    【讨论】:

      【解决方案7】:

      您正在寻找:

      php -d error_reporting="E_ERROR | E_WARNING | E_PARSE"
      

      【讨论】:

      • 嗨@Christian,欢迎来到 StackOverflow!将来,如果您可以在答案中添加一些额外的解释/细节,以启发那些看到它的人为什么/如何解决问题/解决问题,那就太好了。非常感谢,祝你编码愉快:)
      • 没错!我在我的 crontab 中使用 /usr/bin/php -d error_reporting="E_ERROR | E_WARNING | E_PARSE" -f /path/to/file.php
      【解决方案8】:

      我最近发现了这个技巧。 在可能产生警告/错误的行的开头敲一个@。

      它们就像施了魔法一样消失了。

      【讨论】:

      • 这通常是个糟糕的主意,就像戴上耳塞一样,因为你的车发出可怕的磨擦声。
      • 这在某些情况下实际上非常有意义,例如在渲染变量时,无论它是设置还是空。
      • 只有当您拥有作者尚未更新的 WordPress 插件之类的东西并且您确切知道导致问题的原因时才有意义。不过,这是一个创可贴,而不是解决办法。
      • 我喜欢error_reporting() 和'@'。我不知道其中任何一个。谢谢你。我喜欢'@',因为它提供了与 error_reporting(0) 相同的功能并且更易于键入。如果这个问题更像是“挂在排气管上的衣架”而不是“可怕的磨擦声”,那么它可以让项目向前推进。有时间时,我可以轻松找到并修复这些问题。这有助于解决错误是由从文件中读取的数据引起的问题,因此没有拼写错误或库问题。
      • 只要确保你把@放在你100%确定你在做什么的地方。
      【解决方案9】:

      您可以在脚本中设置ini_set('display_errors',0); 或使用error_reporting() 定义要显示的错误。

      【讨论】:

      • 我需要使用这里提到的ini_set方法,其他地方提到的error_reporting(0)方法没有任何效果。
      【解决方案10】:

      对于 PHP 代码:

      <?php
      error_reporting(E_ALL & ~E_NOTICE);
      

      对于php.ini 配置:

      error_reporting = E_ALL & ~E_NOTICE
      

      【讨论】:

        【解决方案11】:

        通过不引起错误:

        defined('DIR_FS_CATALOG') || define('DIR_FS_CATALOG', 'whatever');
        

        如果您确实需要,则使用 error_reporting() 将错误报告更改为 E_ALL^E_NOTICE。

        【讨论】:

        • 如果它是一个生产站点,无论您是否认为它没有错误,如果出现错误,您仍然不应该显示错误 - 所以“不引起错误”似乎有点厚颜无耻一个有效的问题。
        • 什么时候可以允许生产站点中的错误?我同意在生产站点上您不应该显示错误,这不是我要说的。我是说你应该检查是否定义了常量,如果没有就设置它(这就是我给出代码示例的原因)。
        • 虽然你的回答不是“最好的”,但它似乎最充分地回答了 OP 的问题。为您的答案 +1 并且/希望它被标记为答案,因为它是正确的答案。
        • @Nazca 是的,我已经改变了自己的举止并尝试变得更加友好。 :)
        【解决方案12】:

        使用 phpinfo() 并搜索 Configuration File (php.ini) Path 以查看使用的 php 配置文件路径。 PHP 可以有多个配置文件,具体取决于它运行的环境。通常,对于控制台它是:

        /etc/php5/cli/php.ini

        对于由 apache 运行的 php,它是:

        /etc/php5/apache2/php.ini

        然后按你需要的方式设置error_reporting

        http://www.phpknowhow.com/configuration/php-ini-error-settings/ http://www.zootemplate.com/news-updates/how-to-disable-notice-and-warning-in-phpini-file

        【讨论】:

          【解决方案13】:

          正如某些人所提到的,如果您是代码作者,您应该更正所有这些错误、通知等,因为从长远来看,与不修复它们相比,这会给您带来更多问题(尤其是在升级操作系统时)。对于您的服务器,错误应该只显示在您的日志中,而不是客户端的屏幕中。

          因此,为避免浏览器中的错误,请使用您已经找到的 display_errors 标志:

          display_errors = Off
          

          现在真正的问题是当您运行其他人的代码时。在这种情况下,每次升级代码时,修改代码很可能会被覆盖。维护该代码很繁琐。

          在我的例子中,我使用crontab 运行PHP,以便偶尔运行wp-cron.php 脚本。我收到错误发送到我的电子邮件,当您每 10 分钟收到一封电子邮件时,这变得乏味!但是,在这种情况下,Wordpress 系统的配置文件包含一个WP_DEBUG,并且它们调用error_reporting() 函数,因此尝试在命令行上更改error_reporting 变量将不起作用。相反,您必须编辑根文件夹中的wp-config.php 文件并确保将WP_DEBUG 设置为false。否则,您将一直收到所有这些警告和通知。

          【讨论】:

            【解决方案14】:

            error_reporting(E_ERROR);为我工作。

            【讨论】:

              【解决方案15】:

              您可以使用以下方法检查常量是否已定义:

              <?php
              if (!defined('MYCONST'))
                  define('MYCONST', 'Weeha!');
              ?>
              

              【讨论】:

                【解决方案16】:

                我相信在 php.ini 中注释掉 display_errors 是行不通的,因为默认值为 On。您必须改为将其设置为“关闭”。

                不要忘记重新启动 Apache 以应用配置更改。

                另请注意,虽然您可以在运行时设置 display_errors,但在此处更改它不会影响 FATAL 错误。

                正如其他人所指出的,理想情况下,在开发过程中,您应该在可能的最高级别运行 error_reporting 并启用 display_errors。虽然在您刚开始时很烦人,但这些错误、警告、通知和严格的编码建议都会加起来,让您成为更好的编码员。

                【讨论】:

                  【解决方案17】:

                  双重定义的常量

                  要在此处修复特定错误,您可以在定义常量之前检查是否已定义常量:

                  if ( ! defined( 'DIR_FS_CATALOG' ) ) 
                    define( 'DIR_FS_CATALOG', 'something...' );
                  

                  我个人会先在代码库中搜索常量DIR_FS_CATALOG,然后用它替换双重定义。

                  逐个隐藏 PHP 通知

                  PHP 提供了@ 错误控制运算符,您可以使用它来忽略导致通知或警告的特定函数。

                  使用此选项,您可以在代码中根据具体情况忽略/禁用通知和警告,这对于错误或通知是有意的、有计划的或非常烦人且无法解决的情况很有用在源头。在引起通知的函数或 var 前放置 @,它将被忽略。

                  这是一个例子:

                  // Intentional file error
                  $missing_file = @file( 'non_existent_file' );
                  

                  更多信息请参见PHP's Error Control Operators docs。

                  【讨论】:

                    【解决方案18】:

                    如果你从命令行运行,你可以这样做:

                    php -d display_errors="0" script.php 2&gt;/dev/null

                    你必须包含 -d display_errors="0" 以及将 stderr 重定向到 null,很奇怪

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      相关资源
                      最近更新 更多