error_reporting

(PHP 4, PHP 5, PHP 7, PHP 8)

error_reporting设置报告哪些 PHP 错误

描述

error_reporting(?int $error_level = null): int

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

参数

error_level

新的 error_reporting 级别。它采用位掩码或命名常量。强烈建议使用命名常量以确保与未来版本的兼容性。随着错误级别的增加,整数范围也会增加,因此较旧的基于整数的错误级别不会总是按预期工作。

可用的错误级别常量和这些错误级别的实际含义在 预定义常量 中描述。

返回值

返回 error_reporting 级别,它更改为 error_level 之前。

注意: 错误控制 @ 运算符在错误处理期间更改 error_level

变更日志

版本 描述
8.0.0 error_level 现在可以为 null。

示例

示例 #1 error_reporting() 示例

<?php

// 关闭所有错误报告
error_reporting(0);

// 报告简单的运行时错误
error_reporting(E_ERROR | E_WARNING | E_PARSE);

// 报告 E_NOTICE 也可能不错(报告未初始化变量或捕获变量名拼写错误...)
error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);

// 报告除 E_NOTICE 之外的所有错误
error_reporting(E_ALL & ~E_NOTICE);

// 报告所有 PHP 错误
error_reporting(E_ALL);

// 报告所有 PHP 错误
error_reporting(-1);

// 与 error_reporting(E_ALL); 相同
ini_set('error_reporting', E_ALL);

?>

注释

提示

传入值 -1 将显示所有可能的错误,即使在将来的 PHP 版本中添加了新的级别和常量。此行为等同于传递 E_ALL 常量。

参见

添加注释

用户贡献的注释 27 个注释

368
info at hephoz dot de
16 年前
如果你只看到一个空白页面而不是错误报告,并且你没有服务器访问权限,所以你不能编辑 php 配置文件,如 php.ini,请尝试以下操作

- 创建一个新文件,在其中包含有错误的脚本

<?php
error_reporting
(E_ALL);
ini_set("display_errors", 1);
include(
"file_with_errors.php");
?>

- 执行此文件而不是有错误的脚本文件

现在应该报告有错误的脚本的错误。
这对我很有效。希望它也能解决你的问题!
51
dave at davidhbrown dot us
18 年前
E_ALL ^ E_NOTICE 的示例对于我们这些不太精通位运算符的人来说有点令人困惑。

如果你想从当前级别移除通知,无论该未知级别是什么,请使用 & ~

<?php
//....
$errorlevel=error_reporting();
error_reporting($errorlevel & ~E_NOTICE);
//... 生成通知的代码
error_reporting($errorlevel);
//...
?>

^ 是异或(位翻转)运算符,如果通知之前处于关闭状态(在它左侧的错误级别中),它实际上会打开通知。它在示例中起作用是因为 E_ALL 保证设置了 E_NOTICE 的位,因此当 ^ 翻转该位时,它实际上被关闭了。& ~(与非)将始终关闭由右侧参数指定的位,无论它们是处于打开还是关闭状态。
12
jcastromail at yahoo dot es
3 年前
在 PHP 8.0 中,当代码使用 @ 字符时,error_reporting() 不会返回 0。

例如

<?php

$a
=$array[20]; // error_reporting() 在 php <8 中返回 0,在 PHP>=8 中返回 4437

?>
4
lhenry at lhenry dot com
4 年前
在 php7 中,通常是通知或弃用现在是警告:与 mysql 错误相同级别……对我来说是不可接受的。

我确实有数十个旧项目,我当然不想定义我 20 年前写过的每个变量。

因此有两个选择:让 php7 降级我昂贵的 SSD 每小时写入 Gb 或实现类似于服务器级监控的东西(在 php.ini 中使用 auto_[pre-ap]pend_file)并关闭 E_WARNING

自定义覆盖 php 错误级别应该非常方便且灵活……
7
ecervetti at orupaca dot fr
15 年前
这可以为某人节省两分钟
E_ALL & ~E_NOTICE 的整数值为 6135
6
Fernando Piancastelli
19 年前
如果你的 php.ini 中的 display_errors 指令设置为“Off”,无论你设置的报告级别如何,error_reporting() 函数都不会有效。我必须设置

display_errors = On
error_reporting = ~E_ALL

以保持默认情况下没有错误报告,但能够在我的脚本中更改错误报告级别。
我使用的是 PHP 4.3.9 和 Apache 2.0。
1
&IT
4 年前
error_reporting(E_ALL);
if (!ini_get('display_errors')) {
ini_set('display_errors', '1');
}
3
vdephily at bluemetrix dot com
19 年前
请注意,E_NOTICE 会警告你关于未初始化的变量,但分配键/值对被视为初始化,不会触发任何错误
<?php
error_reporting
(E_ALL);

$foo = $bar; //注意:$bar 未初始化

$bar['foo'] = 'hello'; // 不会发出通知,尽管 $bar 本身从未初始化(例如,使用“$bar = array()”)

$bar = array('foobar' => 'barfoo');
$foo = $bar['foobar'] // 正常

$foo = $bar['nope'] // 注意:没有此索引
?>
1
chris at ocproducts dot com
7 年前
如果在调用树中的某个地方(通过 @ 运算符)当前启用了错误抑制,则 error_reporting() 函数将返回 0。
4
keithm at aoeex dot com
14 年前
在页面的编译过程中,似乎会抛出一些 E_STRICT 错误。这意味着它们无法通过在该页面中运行时动态更改错误级别来禁用。

解决方法是重命名文件,并将原始文件替换为 error_reporting() 调用,然后进行 require() 调用。

例如,将 index.php 重命名为 index.inc.php,然后重新创建 index.php 如下所示

<?php
error_reporting
(E_ALL & ~(E_STRICT|E_NOTICE));
require(
'index.inc.php');
?>

这样就可以在编译文件之前更改错误报告。

我最近发现这个问题,当时我从另一家开发公司那里获得了代码,该代码触发了几个 E_STRICT 错误,我想在每个页面上禁用 E_STRICT。
0
huhiko334 at yandex dot ru
5 年前
如果你遇到奇怪的 mysql 警告,例如“警告:mysql_query():你的查询需要完整表扫描……”,不要查找 error_reporting 设置,它是在 php.ini 中设置的。
你可以在脚本中通过以下方法关闭它
ini_set("mysql.trace_mode","Off");
在你的脚本中
http://tinymy.link/mctct
0
kevinson112 at yahoo dot com
6 年前
我遇到过这样一个问题:如果出现错误,php 就会给我一个空白页面。任何错误都会强制显示空白页面,而不是任何输出,即使我确保将 error_reporting 设置为 E_ALL,并将 display_errors 启用等等。但仅仅在不同的目录中运行文件就可以显示错误!

事实证明,该目录中的 error_log 文件已满(2.0 Gb)。我删除了该文件,现在错误已正常显示。关闭错误日志记录也可能有所帮助。

https://techysupport.co/norton-tech-support/
0
adam at adamhahn dot com
7 年前
为了扩展 chris at ocproducts dot com 的说明,如果你在 error_reporting() 前面加上 @,该函数将始终返回 0。

<?php
error_reporting
(E_ALL);
var_dump(
error_reporting(), // E_ALL 的值,
@error_reporting() // 值为 0
);
?>
2
j dot schriver at vindiou dot com
23 年前
如果你已经使用 set_error_handler() 定义了自己的错误处理程序,那么 error_reporting() 不会有任何影响。

[编辑说明:这并不完全准确。

E_ERROR、E_PARSE、E_CORE_ERROR、E_CORE_WARNING、E_COMPILE_ERROR 和 E_COMPILE_WARNING 错误级别将根据 error_reporting 设置进行处理。

所有其他级别的错误将传递给由 set_error_handler() 定义的自定义错误处理程序。

Zeev Suraski 建议,使用自定义错误处理程序时,简单的方法是将以下代码行添加到错误处理函数的顶部

if (!($type & error_reporting())) return;

[email protected]]
0
qeremy ! gmail
9 年前
如果你想在本地环境中查看所有错误,可以在本地将你的项目 URL 设置为“foo.com.local”,并将它放在引导文件中。

<?php
if (substr($_SERVER['SERVER_NAME'], -6) == '.local') {
ini_set('display_errors', 1);
ini_set('error_reporting', E_ALL);
// 或 error_reporting(E_ALL);
}
?>
0
rojaro at gmail dot com
13 年前
要为*所有*错误消息(包括所有错误级别,包括 E_STRICT、E_NOTICE 等)启用错误报告,只需使用

<?php error_reporting(-1); ?>
0
DarkGool
18 年前
在 phpinfo() 中,错误报告级别显示为位(例如 4095)

这可能是了解主机上设置了哪些级别的简单方法
如果你无法访问 php.ini 文件

<?php
$bit
= ini_get('error_reporting');
while (
$bit > 0) {
for(
$i = 0, $n = 0; $i <= $bit; $i = 1 * pow(2, $n), $n++) {
$end = $i;
}
$res[] = $end;
$bit = $bit - $end;
}
?>

在 $res 中,你将拥有所有错误报告常量
$res[]=int(16) // E_CORE_ERROR
$res[]=int(8) // E_NOTICE
...
-1
luisdev
6 年前
本文引用了这两个报告级别

// 报告所有 PHP 错误(参见变更日志)
error_reporting(E_ALL);

// 报告所有 PHP 错误
error_reporting(-1);

这两个级别有什么区别?

请在本文中更新这两个级别之间的差异和可能的用例的清晰说明。
-2
teynon1 at gmail dot com
12 年前
将 E_COMPILE_ERROR 包含在 error_reporting 中可能是一个好主意。

如果你有一个不输出警告的客户错误处理程序,如果“require”失败,你可能会看到一个白屏。

示例
<?php
error_reporting
(E_ERROR | E_WARNING | E_PARSE);

function
myErrorHandler($errno, $errstr, $errfile, $errline) {
// 执行一些操作,而不是输出消息。
return true;
}

$old_error_handler = set_error_handler("myErrorHandler");

require
"此文件不存在";
?>

为了防止这种情况,只需在 error_reporting 中包含 E_COMPILE_ERROR。

<?php
error_reporting
(E_ERROR | E_WARNING | E_PARSE | E_COMPILE_ERROR);
?>
-1
roberto at spadim dot com dot br
14 年前
查看有关 php 5.3 已弃用错误的更多信息

https://php.net/manual/en/migration53.deprecated.php
-1
fredrik at demomusic dot nu
19 年前
请记住,error_reporting 值是整数,而不是字符串,即“E_ALL & ~E_NOTICE”。

这在 httpd.conf 中设置 error_reporting 级别时非常有用

使用上面的表格或

<?php
ini_set
("error_reporting", E_YOUR_ERROR_LEVEL);
echo
ini_get("error_reporting");
?>

获取错误级别的相应整数。然后使用

php_admin_value error_reporting YOUR_INT

在 httpd.conf 中

我想分享这个相当直接的技巧,因为它对试图理解为什么在将错误级别设置为 (int) "E_ALL" = 0 时事情不起作用的新 PHP 用户来说相当令人恼火……

也许 PHP 开发人员应该让 error_reporting("E_ALL") 输出有关错误的 E_NOTICE 信息性消息?
-2
Rash
9 年前
如果你使用的是 PHP 开发服务器,通过 `php -S servername:port` 从命令行运行,每个错误/通知/警告都将在命令行本身中报告,包括文件名、行号和堆栈跟踪。

因此,如果你想在页面重新加载后仍然保留所有错误的日志(用于调试帮助,可能),运行 PHP 开发服务器可能很有用。
-2
kc8yds at gmail dot com
16 年前
这用于显示在不同版本上可能运行的代码的所有错误

对于 php 5,它显示 E_ALL^E_STRICT,而对于其他版本,它只显示 E_ALL。

如果有人发现任何问题,请更正这篇文章。

<?php
ini_set
('error_reporting', version_compare(PHP_VERSION,5,'>=') && version_compare(PHP_VERSION,6,'<') ?E_ALL^E_STRICT:E_ALL);
?>
-4
misplacedme at gmail dot com
15 年前
我一直使用 E_ALL 设置进行编码。
在几页
<?php
$username
= (isset($_POST['username']) && !empty($_POST['username']))....
?>

之后,我创建了这个函数来加快速度。通过引用传递的未设置值不会触发通知。

<?php
function test_ref(&$var,$test_function='',$negate=false) {
$stat = true;
if(!isset(
$var)) $stat = false;
if (!empty(
$test_function) && function_exists($test_function)){
$stat = $test_function($var);
$stat = ($negate) ? $stat^1 : $stat;
}
elseif(
$test_function == 'empty') {
$stat = empty($var);
$stat = ($negate) ? $stat^1 : $stat;
}
elseif (!
function_exists($test_function)) {
$stat = false;
trigger_error("$test_function() is not a valid function");
}
$stat = ($stat) ? true : false;
return
$stat;
}
$a = '';
$b = '15';

test_ref($a,'empty',true); //False
test_ref($a,'is_int'); //False
test_ref($a,'is_numeric'); //False
test_ref($b,'empty',true); //true
test_ref($b,'is_int'); //False
test_ref($b,'is_numeric'); //false
test_ref($unset,'is_numeric'); //false
test_ref($b,'is_number'); //returns false, with an error.
?>
-4
forcemdt
10 年前
Php >5.4

创建自定义错误处理程序

set_error_handler("customError",E_ALL);
function customError($errno, $errstr)
{
echo "<b>Error:</b> [$errno] $errstr<br>";
echo "Ending Script";
die();
}
-4
Daz Williams (The Northeast)
15 年前
只将 php 错误显示给开发人员...

<?php
if($_SERVER['REMOTE_ADDR']=="00.00.00.00")
{
ini_set('display_errors','On');
}
else
{
ini_set('display_errors','Off');
}
?>

只需将 00.00.00.00 替换为您的 IP 地址。
-3
Alex
17 年前
如果使用 @ 错误抑制指令,error_reporting() 可能会给出意外的结果。

<?php
@include 'config.php';
include
'foo.bar'; // non-existent file
?>

config.php
<?php
error_reporting
(0);
?>

将抛出与不存在的文件相关的错误级别 E_WARNING(当然取决于您的配置设置)。如果删除抑制器,则此操作按预期工作。

或者,在 config.php 中使用 ini_set('display_errors', 0) 将达到相同的结果。这与上面的说明相反,上面的说明说这两个指令是等效的。
To Top