PHP 5禁用严格标准错误


175

我需要在顶部设置PHP脚本以禁用严格标准的错误报告。

有人可以帮忙吗?


8
@ 451F:我认为这里的关键词是“严格标准”。我不知道以前的版本,但是对于PHP 5.4.0,建议您将错误报告设置E_ALL & ~E_DEPRECATED & ~E_STRICT为生产。请注意,他们建议您禁用严格的标准。
Fake Code Monkey Rashid'9

还要找到您的php.ini文件,并将其复制到/ usr / local / php5 / lib /
yadhu 2012年

Answers:


185

您要禁用错误报告,还是只是阻止用户查看错误报告?即使在生产站点上,记录错误通常也是一个好主意。

# in your PHP code:
ini_set('display_errors', '0');     # don't show any errors...
error_reporting(E_ALL | E_STRICT);  # ...but do log them

它们将被记录到您的标准系统日志中,或者使用error_log伪指令来指定您希望错误出现的确切位置。


11
为了明确说明显而易见的事实:当然,您也可以在php.ini文件中进行设置,例如,如果您不能修改PHP代码。
sschuberth 2013年

1
但是,记录生产中的严格错误也是一个坏习惯。由于您会在日志中填充可能无关紧要的通知,因此会导致以下一个或两个问题:serverAdmin将丢失/忽略错误,并且日志目录有时会占用所有服务器空间。
Lance

4
这对我不起作用-必须使用以下答案中的Fake Code Monkey Rashid的E_ALL和〜E_STRICT注释
非常简单,2015年

1
如何与我在php.ini中找到的以下内容一起工作log_errors = On vs. ini_set('display_errors','0'); 是最后一组获胜吗?
着陆

@nate发布代码时,请告诉我们粘贴位置。我不知道在哪里把它:进入php.ini.htaccess或在我的PHP代码的某个地方。
ДаниилПронин

89

没有错误。

error_reporting(0);

还是不严格

error_reporting(E_ALL ^ E_STRICT);

如果您想再次显示所有错误,请使用

error_reporting(-1);


56
+1:我相信^只能消除一种错误。如果要关闭其他类型,则应使用该E_ALL & ~E_DEPRECATED & ~E_STRICT格式。也许是(E_ALL & ~(E_DEPRECATED | E_STRICT))格式。
Fake Code Monkey Rashid

10
注意:自PHP 5.4以来,E_STRICT仅是E_ALL的一部分
Fred Haslam

@FakeCodeMonkeyRashid我想知道为什么吗?可能是因为这样的撤离顺序很重要吗?
编码

禁止报告PHP <5.4中ini_set('error_reporting', E_ALL&~E_STRICT); 的STRICT错误禁止报告PHP> = 5.4中的STRICT错误ini_set('error_reporting', E_ALL^E_STRICT);
Mel_T 2016年

我想指出,使用^(“ xor”)而不是& ~(“ and not”)是一个坏主意^取决于这样的假设,例如E_STRICT是E_ALL的一部分,并且将始终是E_ALL的一部分。这很不好,因为E_ALL过去确实发生过更改(E_STRICT过去没有改变,但是自PHP 5.4起就已经改变了)。如果假设有一天失败了,^不仅会失败,而且实际上会做预期相反的事情:由于XOR()的工作原理,它将启用 E_STRICT ^& ~但是,无论E_ALL的当前值如何,都将始终禁用E_STRICT。因此& ~应使用。
周杰伦

31

以上所有解决方案都是正确的。但是,当我们谈论普通的PHP应用程序时,必须将其包含在所需的每个页面中。解决此问题的一种方法是通过.htaccess根文件夹。只是为了掩盖错误。[将以下行之一放入文件中]

php_flag display_errors off

要么

php_value display_errors 0

接下来,设置错误报告

php_value error_reporting 30719

如果您想知道值的30719来源,E_ALL(32767),E_STRICT(2048)实际上是常量,它们保存数值和(32767 - 2048 = 30719


2
非常感谢-这在PHP 5.4.7中完成了技巧(.htaccess解决方案)-别无他物-甚至修改.ini-都在完成技巧。

我曾php_admin_value error_reporting为此工作(在vhost配置中)。
Lou Terrailloune

@Seza,正确修复它。
Starx

1
它与页面无关,因此首选此方法,因为大多数E_STRICT错误是编译时的,并且无法在运行时覆盖
AbiusX 2013年

2
嗨,为了让您轻松一点,对于使用wamp的用户,可以通过单击php> php settings >> display errors禁用错误。如果已选中,则取消选中它。
Hemang Rami 2014年

9

如果未在php.ini中设置,则error_reporting标志的默认值为E_ALL和〜E_NOTICE。但是在某些安装中(尤其是针对开发环境的安装)具有E_ALL | E_STRICT设置为此标志的值(这是开发期间建议值)。在某些情况下,特别是当您要运行一些开源项目时,这些项目是在PHP 5.3时代之前开发的,并且尚未使用PHP 5.3定义的最佳实践进行更新,因此在开发环境中,您可能会遇到一些麻烦。您收到的消息。应对这种情况的最佳方法是,仅将E_ALL设置为error_reporting标志的值,php.ini代码中(可能在Web根目录中的前控制器(如index.php)中,如下所示:

if(defined('E_STRICT')){
    error_reporting(E_ALL);
}

8

在php.ini中设置:

error_reporting = E_ALL & ~E_NOTICE & ~E_STRICT

4

WordPress的

如果您在wordpress环境中工作,Wordpress会在function中的wp-includes / load.php文件中设置错误级别wp_debug_mode()。因此,您必须在调用此函数后更改级别(在未检入git的文件中,仅用于开发),或者直接修改该error_reporting()调用


这真的很有用,我安装了一个Wordpress安装调试模式,却没有意识到这样做。感谢您的信息!
蒂姆(Tim)

2

我没有一个干净的答案,不适合用于生产就绪的软件,所以就这样:

/*
 * Get current error_reporting value,
 * so that we don't lose preferences set in php.ini and .htaccess
 * and accidently reenable message types disabled in those.
 *
 * If you want to disable e.g. E_STRICT on a global level,
 * use php.ini (or .htaccess for folder-level)
 */
$old_error_reporting = error_reporting();

/*
 * Disable E_STRICT on top of current error_reporting.
 *
 * Note: do NOT use ^ for disabling error message types,
 * as ^ will re-ENABLE the message type if it happens to be disabled already!
 */
error_reporting($old_error_reporting & ~E_STRICT);


// code that should not emit E_STRICT messages goes here


/*
 * Optional, depending on if/what code comes after.
 * Restore old settings.
 */
error_reporting($old_error_reporting);
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.