如何关闭PHP注意事项?


126
Notice: Constant DIR_FS_CATALOG already defined

我已经注释掉display_errorsphp.ini,但不能正常工作。

如何使PHP不向浏览器输出此类信息?

更新

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

这是PHP 5.3的问题吗?

也报告大量调用堆栈


3
如果您使用的是Apache,则可能必须重新启动服务器!如果您使用的是XAMPP,只需在管理器应用中选择“重新启动”。
st4wik 2015年

2
我建议运行grep display_errors /path/to/php.ini以查看您的行是否在文件下方的某个位置被覆盖。这就是发生在我身上的事情。
usandfriends

错误报告是解决方案
David Stienen

尝试ini_set('display_errors',0)在您的PHP文件。当ini设置不起作用时,应检查是否phpinfo()显示所需的值。如果不是,则您更改了错误的ini文件,或者某些内容覆盖了php.ini中的值
Radon8472,19年

这不是php 5.3的错误。display_errors从php 4.0.3一直运行到最新版本@see 3v4l.org/87gIl
Radon8472 '19

Answers:


78

您可以设置display_errors0或使用该error_reporting()功能。

但是,通知很烦人(我可以部分同情),但它们是有目的的。您不应该定义两次常量,第二次将不起作用,并且常量将保持不变!


4
+1:我赞成提及他应该更正错误,而不是关闭报告。而且您的做法比@Jonathan Kuhn更为温和:-)
乔什(Josh)2010年

1
不,似乎这是php5.3的错误,display_errors无法按预期工作。
user198729

@user尝试phpinfo()查看设置是否真正适用。原谅我,但我非常怀疑您是否在PHP 5.3中发现了一个错误-我只有在看到它时才会相信它:)
Pekka 2010年

奇怪,local value打开了,但是master value关闭了,不知道那到底是什么意思……
user198729 2010年

1
@user我认为本地值可以来自文件中的ini_set指令或 php_ini_flag设置.htaccess
Pekka 2010年

242

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

?>

非常有帮助,并给出了问题的答案。虽然我知道最好也修复所有通知。有时,显示除通知之外的所有内容都非常方便。
Timo002

3
如上文所述,使用^ NOTICE仅关闭通知对我不起作用。对于PHP v5.3,请使用:E_ALL和
〜E_NOTICE

如果您有一个REST API返回JSON或XML或其他内容,则可能需要关闭它们。或者至少将它们转换为异常并进行相应处理。
TheRealChx101 '18 -10-10

你好。为我工作。非常感谢你。
H. Farid

Display_errors控制是否将错误发送到stdoutput。但是,当将error_reporting更改为0时,您将完全禁用所有错误处理和错误日志记录内容。您绝对不要执行error_reporting(0)。
Radon8472

30

对于命令行php,设置

error_reporting = E_ALL & ~E_NOTICE

/etc/php5/cli/php.ini

php然后,命令执行将省略通知。


通过在php.ini中执行此error_reporting = E_ALL&〜E_NOTICE&〜E_WARNING。它禁用PHP注意事项和PHP警告。这样一来,在浏览器中就不会看到php通知和php警告
Deepak Lamichhane 2012年

这适用于控制台php设置。如果您使用php通过apache2生成网页,则Web服务器的配置文件为/etc/php5/apache2/php.ini。最好使用phpinfo()来查看实际使用的配置文件。
MilanG

23
<?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


2
这不只是几年前发布的现有答案的重复吗?

我们俩都从php文档中复制粘贴,并且两个答案都提到了资源。
Abhishek Goel

@AbhishekGoel独角兽是变相的小马,那句话无关紧要,四年后您仍然复制了已经存在的答案
里奇·博伊斯

@RickyB我没有检查现有答案,也没有复制。
Abhishek Goel

12

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

error_reporting(E_ALL ^ E_NOTICE);  

我认为它对你满满。


6

您正在寻找:

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

2
@Christian,您好,欢迎来到StackOverflow!将来,如果您可以在回答中添加一些额外的解释/细节来启发那些了解该解决方案的原因/方式/解决问题的人,那将是很棒的。非常感谢,
并祝您编程

1
究竟!我将其/usr/bin/php -d error_reporting="E_ERROR | E_WARNING | E_PARSE" -f /path/to/file.php用于crontab
vladkras 2016年

4

我更喜欢不设置error_reporting内部代码。但是在一种情况下,旧产品有很多注意事项,因此必须将它们隐藏起来。

因此,我使用以下代码段为设置了服务器端配置的值,error_reporting但减去了E_NOTICEs。

error_reporting(error_reporting() & ~E_NOTICE);

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


3

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


我需要使用ini_set这里提到的error_reporting(0)方法,其他地方提到的方法没有任何效果。
pix 2014年

3

通过不引起错误:

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

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


1
如果它是生产站点,则无论您是否认为它都没有错误,如果出现错误,您仍然不应该显示错误-因此“不引起错误”似乎对有效的问题有点厚脸皮。
凸轮

5
因为什么时候可以允许生产现场出现错误?我同意在生产站点上不应显示错误,这不是我所说的。我是说您应该检查是否定义了常量,如果没有定义,请设置它(这就是我给出代码示例的原因)。
乔纳森·库恩

尽管您的回答不是“最聪明的”,但它似乎已充分回答了OP的问题。为您的答案+1,并/希望将其标记为答案,因为它是正确的答案。
纳斯卡2014年

@Nazca是的,自那以后,我改变了举止,并变得更加友善。:)
乔纳森·库恩

2

对于PHP代码:

<?php
error_reporting(E_ALL & ~E_NOTICE);

对于php.ini配置:

error_reporting = E_ALL & ~E_NOTICE

1

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

他们仿佛被魔术迷失了。


21
那通常是个糟糕的主意,就像放耳塞一样,因为您的汽车发出可怕的磨擦声。
大卫·莫罗

10
对于某些实例,这实际上是很有意义的,例如,在渲染变量时,无论变量是已设置还是为空。
弗朗斯2013年

1
仅当您拥有作者尚未更新的类似WordPress插件之类的东西并且您确切知道是什么引起问题时,这才有意义。这是一个创可贴,而不是解决方法。
势在必行的2013年

我同时喜欢error_reporting()和'@'。我什么都不知道。谢谢。我喜欢'@',因为它提供了error_reporting(0)的相同功能,并且更易于键入。如果问题更像是“衣架挡住了排气口”而不是“可怕的磨擦声”,那么它可以使项目继续进行。有时间我可以轻松找到并修复这些问题。这有助于解决错误是由于从文件读取数据而导致的问题,因此不会造成拼写错误或库问题。
马克·朗米尔

1
只要确保将@放在100%的位置即可确定您在做什么。
尼克

1

使用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-文件


1

就像某些人提到的那样,如果您是代码编写者,则应更正所有这些错误,声明等,因为从长远来看,这将给您带来更多麻烦,而不是没有解决这些问题(尤其是在升级操作系统时)。对于服务器,您应该只在日志中显示错误,而不是在客户端屏幕中显示。

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

display_errors = Off

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

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



0

我相信在php.ini中注释掉display_errors不会起作用,因为默认值为On。您必须将其设置为“关”。

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

还要注意,尽管可以在运行时设置display_errors,但在此处更改它不会影响致命错误。

正如其他人所指出的,理想情况下,在开发过程中,应以尽可能最高的级别运行error_reporting并启用display_errors。当您一开始就很烦的时候,这些错误,警告,注意和严格的编码建议都会加在一起,使您成为更好的编码器。


0

双重定义的常数

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

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

我个人将从在代码库中搜索常量开始DIR_FS_CATALOG,然后用这个替换双精度定义。

隐藏PHP会根据情况逐行内联

PHP提供了@错误控制运算符,您可以使用它来忽略引起通知或警告的特定功能。

使用此功能,您可以逐案忽略/禁用代码中的通知和警告,这对于错误或通知是有意,有计划或令人生厌且无法从源头解决的情况很有用。 。@在引起通知的函数或变量之前放置一个,它将被忽略。

这是一个例子:

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

有关更多信息,请参见PHP的错误控制运算符文档。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.