PHP Conference Japan 2024

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 现在可以为空。

示例

示例 #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 条注释

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

- 创建一个新文件,其中包含有问题的脚本

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

- 执行此文件而不是有问题的脚本文件

现在应该会报告有问题的脚本的错误。
这对我很有效。希望它也能解决您的问题!
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 的位,因此当 ^ 翻转该位时,它实际上被关闭了。& ~(与非)将始终关闭右侧参数指定的位,无论它们是打开还是关闭。
jcastromail at yahoo dot es
3 年前
在 PHP 8.0 中,当代码使用 @ 字符时,error_reporting() 不会返回 0。

例如

<?php

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

?>
lhenry at lhenry dot com
5 年前
在 php7 中,通常是通知或弃用现在变成了警告:与 mysql 错误相同的级别……我无法接受。

我有很多旧项目,我当然不想定义我可能在 20 年前写的每个变量。

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

自定义覆盖 php 错误的级别应该非常方便和灵活……
ecervetti at orupaca dot fr
15 年前
这可以为某人节省两分钟。
E_ALL & ~E_NOTICE 的整数值为 6135。
Fernando Piancastelli
19 年前
如果你的 php.ini 文件中的 display_errors 指令设置为 "Off",那么 error_reporting() 函数将无效,无论你设置了哪个级别的错误报告。我不得不设置

display_errors = On
error_reporting = ~E_ALL

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

$foo = $bar; //notice : $bar 未初始化

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

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

$foo = $bar['nope'] // 通知:没有这样的索引
?>
chris at ocproducts dot com
8 年前
如果错误抑制当前在调用树中的某个地方处于活动状态(通过 @ 运算符),则 error_reporting() 函数将返回 0。
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 时发现了这一点。
huhiko334 at yandex dot ru
6 年前
如果你遇到奇怪的 mysql 警告,例如“警告:mysql_query():你的查询需要完整表扫描……”,不要查找 error_reporting 设置——它在 php.ini 中设置。
你可以在你的脚本中使用以下方法将其关闭
ini_set("mysql.trace_mode","Off");
在你的脚本中
http://tinymy.link/mctct
kevinson112 at yahoo dot com
6 年前
我遇到了一个问题,如果出现错误,php 就会给我一个空白页面。任何错误都会强制显示空白页面而不是任何输出,即使我确保将 error_reporting 设置为 E_ALL,将 display_errors 打开等。但是,只需在不同的目录中运行文件即可显示错误!

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

https://techysupport.co/norton-tech-support/
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
);
?>
j dot schriver at vindiou dot com
24 年前
如果你使用 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]]
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);
}
?>
rojaro at gmail dot com
13 年前
要为所有错误消息(包括每个错误级别,包括 E_STRICT、E_NOTICE 等)启用错误报告,只需使用

<?php error_reporting(-1); ?>
DarkGool
19 年前
在 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
...
luisdev
6 年前
本文涉及这两个报告级别。

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

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

这两个级别之间有什么区别?

请更新本文,并清楚解释差异和可能的用例。
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
"此文件不存在";
?>

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

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

https://php.net/manual/en/migration53.deprecated.php
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 提示信息?
Rash
9 年前
如果您使用的是 PHP 开发服务器,则通过 `php -S servername:port` 从命令行运行,每个错误/通知/警告都将在命令行本身中报告,包括文件名、行号和堆栈跟踪。

因此,如果您希望即使在页面重新加载后也保留所有错误的日志(例如,用于调试),运行 PHP 开发服务器可能很有用。
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);
?>
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'); //返回 false,并显示错误。
?>
forcemdt
11 年前
Php >5.4

创建自定义错误处理程序

set_error_handler("customError",E_ALL);
function customError($errno, $errstr)
{
echo "<b>Error:</b> [$errno] $errstr<br>";
echo "脚本结束";
die();
}
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 地址。
Alex
17 年前
如果使用了 @ 错误抑制指令,error_reporting() 可能会产生意外的结果。

<?php
@include 'config.php';
include
'foo.bar'; // 不存在的文件
?>

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

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

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