【问题标题】:Can't change display_errors value无法更改 display_errors 值
【发布时间】:2019-01-15 01:05:43
【问题描述】:

我无法为我的网站关闭 display errors。我使用 ISP 管理器 控制面板。在所有 php.ini 文件和设置中它是 Off。但仍然显示警告和通知。即使在脚本中直接使用ini_set() 也不起作用。你能帮我解决这个问题吗?

<?php

ini_set('display_errors', 0);
phpinfo(); // display_errors is still On On

ini_get('display_errors'); // returns 'stderr'

【问题讨论】:

  • error_reporting(0) 试过了吗?
  • ini_set() 真的失败了吗? "成功时返回旧值,失败时返回 FALSE"。
  • @ÁlvaroGonzález 它返回false

标签: php


【解决方案1】:

如果我理解正确的话,类似于:

var_dump(ini_set('display_errors', 0));

…产生:

bool(false)

我可以想出两种方法来故意防止display_errors被更改:

  1. Disabling ini_set() 完全在系统范围的 INI 文件中,这会产生不同的症状:

    Warning: ini_set() has been disabled for security reasons
    NULL
    

    无论如何都可以检查:

    var_dump(ini_get('disable_functions'));
    
  2. 在 Apache 设置中使用 php_admin_flag 硬编码 display_errors,这仅适用于 PHP 作为 Apache 模块运行但有效地产生布尔值 false 的情况。

我相信我们在#2。你可能想检查whether PHP runs as Apache module;我不知道是否有任何方法可以自行验证是否正在使用php_admin_flag。如果是这样的话,我认为你不走运:

php_admin_flag名字开|关

用于设置布尔配置指令。这不能用于 .htaccess 文件。任何使用php_admin_flag 设置的指令类型都可以 不会被.htaccessini_set() 覆盖

如果您可以控制 Apache 设置,则可以轻松解决此问题。否则,我建议您询问托管支持。恕我直言,在生产服务器中启用display_errors 是不合理的,更不用说强制了:

;该指令控制 PHP 是否以及在何处输出错误,
;通知和警告。 错误输出在开发过程中非常有用,但是
;它在生产环境中可能非常危险。取决于代码
;这是触发错误,敏感信息可能会泄漏
;超出您的应用程序,例如数据库用户名和密码或更糟。
;对于生产环境,我们建议记录错误而不是
;将它们发送到 STDOUT。
;可能的值:
; Off = 不显示任何错误
; stderr = 向 STDERR 显示错误(仅影响 CGI/CLI 二进制文件!)
; On 或 stdout = 向 STDOUT 显示错误
;默认值:开启
;开发价值:开
;产值:关闭
; http://php.net/display-errors

【讨论】:

【解决方案2】:

概述

PHP 中有几种不同类型的错误报告功能。幸运的是,我们在PHP docs here 中有一个很好的解释。

我通常在下面的示例中使用这三个。让我们来看看这些。

分解文档

此函数设置错误报告级别。

error_reporting()

error_reporting() 函数将 error_reporting 指令设置为 运行。 PHP有很多级别的错误,使用这个函数设置 脚本持续时间(运行时)的级别。如果可选级别 未设置,error_reporting() 将只返回当前错误 报告级别。

第一个函数接受一个整数或命名常量的参数。如果 PHP 的未来版本发布新的错误级别,建议使用命名常量。这样,您将始终知道升级到较新版本的 PHP 后会发生什么。

下一个模式决定是否将错误打印到屏幕上。

ini_set('display_errors', 1)

这决定了是否应将错误作为一部分打印到屏幕上 输出或是否应该对用户隐藏。

最后一个处理在 PHP 启动过程中发生的错误。当您打开display_errors 时,它不会处理启动序列中发生的错误。这就是为什么很多时候人们不明白为什么即使他们打开了错误报告也没有看到错误的部分原因。

即使 display_errors 开启,PHP 启动过程中也会出现错误 序列不显示。强烈建议保留 display_startup_errors 关闭,调试除外。

这将告诉应用程序将错误记录到服务器。

ini_set('log_errors', 1);

告诉是否应该将脚本错误消息记录到服务器的 错误日志或 error_log。因此,此选项是特定于服务器的。

示例

要关闭文件中的错误报告,试试这个,

ini_set('display_errors', 0);
ini_set('display_startup_errors', 0);
error_reporting(0);

要在文件中打开错误报告,试试这个,

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

回答

如果您想记录错误但不希望它们出现在屏幕上,那么您需要这样做,

ini_set('display_errors', 0); ini_set('display_startup_errors', 0); error_reporting(E_ALL);

或者试试,

ini_set('display_errors', 0); ini_set('display_startup_errors', 0); ini_set("log_errors", 1); error_reporting(E_ALL);

【讨论】:

  • 我需要error_reporting 来记录错误。我只是不希望它们显示在我的网页上。
  • 我已经在我的回答中提到了这一点。让我知道这是否行不通,但应该这样做。文档中有一个完整的错误日志列表,如果没有,您可以尝试,但我很确定它会起作用。
  • 我的 PHP 引擎似乎不支持 ini_set('display_errors', 0)
猜你喜欢
  • 2011-08-20
  • 2016-08-02
  • 2011-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多