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 禁用严格标准错误的主要内容,如果未能解决你的问题,请参考以下文章