PHP 5 禁用严格标准错误

Posted

技术标签:

【中文标题】PHP 5 禁用严格标准错误【英文标题】:PHP 5 disable strict standards error 【发布时间】:2010-11-17 22:47:43 【问题描述】:

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

有人可以帮忙吗?

【问题讨论】:

@451F:我认为这里的关键词是“严格标准”。我不知道以前的版本,但是对于 PHP 5.4.0,建议您将错误报告设置为 E_ALL & ~E_DEPRECATED & ~E_STRICT 以进行生产。请注意,他们建议您禁用严格标准。 同时找到您的 php.ini 文件并将其复制到 /usr/local/php5/lib/ 【参考方案1】:

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

# 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 指令来指定您希望错误发生的确切位置。

【讨论】:

只是为了明确说明:当然,您也可以在 php.ini 文件中设置这些,例如如果您无法修改 PHP 代码。 然而,在生产中记录严格的错误也是一种不好的做法。由于您将在日志中填充可能无关紧要的通知,从而导致以下一个或两个问题:serverAdmin 将错过/忽略错误,并且日志目录将在某个时候占用所有服务器空间。 这对我不起作用 - 必须使用来自下面答案的 Fake Code Monkey Rashid 评论中的 E_ALL 和 ~E_STRICT 如何与我在 php.ini log_errors = On Vs ini_set('display_errors', '0'); 中找到的以下内容一起工作最后一组赢了吗? @nate 当您发布一些代码时,请告诉我们可以将其粘贴到哪里。我不知道该放在哪里:放入php.ini.htaccess 或我的PHP 代码中的某处。【参考方案2】:

为了没有错误。

error_reporting(0);

或者只是不严格

error_reporting(E_ALL ^ E_STRICT);

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

error_reporting(-1);

【讨论】:

+1:我相信^ 只适用于省略一种错误。如果您想关闭其他类型,您应该使用E_ALL & ~E_DEPRECATED & ~E_STRICT 格式。或者可能是(E_ALL & ~(E_DEPRECATED | E_STRICT)) 格式。 注意:自 php 5.4 起,E_STRICT 只是 E_ALL 的一部分 @FakeCodeMonkeyRashid 我想知道为什么会这样?可能是因为评估顺序很重要? 禁止报告 PHP 中的 STRICT 错误 ini_set('error_reporting', E_ALL&~E_STRICT); 禁止报告 PHP 中的 STRICT 错误 >= 5.4 ini_set('error_reporting', E_ALL^E_STRICT); 我想指出,使用^ ("xor") 而不是& ~ ("and not") 是一个坏主意^ 取决于 假设,例如E_STRICT 是 E_ALL 的一部分,总是 将是它的一部分。这很糟糕,因为 E_ALL 在过去确实发生了变化(E_STRICT 并没有过去,但现在是 PHP 5.4 之后的版本)。如果某一天假设失败,^ 不仅会中断,而且实际上会执行它应该做的相反:它将启用 E_STRICT,因为 XOR ( ^) 有效。 & ~ 然而将总是禁用 E_STRICT,无论 E_ALL 的当前值如何。因此应该使用& ~【参考方案3】:

以上所有解决方案都是正确的。但是,当我们谈论一个普通的 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) 的常量

【讨论】:

非常感谢 - 这在 PHP 5.4.7 中起到了作用(.htaccess 解决方案) - 没有其他方法 - 甚至修改 .ini - 都起到了作用。 我使用php_admin_value error_reporting 来实现这个功能(在虚拟主机配置中)。 @Seza,正确修复它。 它与页面无关,这种方法是首选,因为大多数 E_STRICT 错误是编译时的,不能在运行时覆盖 您好,为了方便起见,对于那些使用 wamp 的人,您可以通过单击 php > php settings >> display errors 来禁用错误。如果选中,则取消选中。【参考方案4】:

如果未在 php.ini 中设置,error_reporting 标志的默认值为 E_ALL & ~E_NOTICE。 但在某些安装中(特别是针对开发环境的安装)有 E_ALL | E_STRICT 设置为 此标志 的值(这是开发期间的推荐值)。在某些情况下,特别是当您想要运行一些在 PHP 5.3 时代之前开发且尚未使用 PHP 5.3 定义的最佳实践进行更新的开源项目时,您可能会在开发环境中遇到一些问题像你收到的消息。应对这种情况的最佳方法是在 php.ini代码(可能在 web-root 中的 index.php 之类的前端控制器中,如下所示:

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

【讨论】:

【参考方案5】:

在 php.ini 中设置:

error_reporting = E_ALL & ~E_NOTICE & ~E_STRICT

【讨论】:

【参考方案6】:

WordPress

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

【讨论】:

这真的很有用,我为一个 Wordpress 安装打开了调试模式,但没有意识到它这样做了。感谢您的信息!【参考方案7】:

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

/*
 * 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);

【讨论】:

以上是关于PHP 5 禁用严格标准错误的主要内容,如果未能解决你的问题,请参考以下文章

如何消除 php5 Strict 标准错误?

Wordpress:禁用白屏死机,启用标准 PHP 错误

严格标准:Joomla 中的非静态方法错误

文件上传中的严格标准错误

php数组上的严格标准消息

password_hash 给出错误:严格标准:只有变量应该通过引用传递[重复]