如果你只看到一个空白页面而不是错误报告,并且你没有服务器访问权限,所以你不能编辑 php 配置文件,如 php.ini,请尝试以下操作
- 创建一个新文件,在其中包含有错误的脚本
<?php
error_reporting(E_ALL);
ini_set("display_errors", 1);
include("file_with_errors.php");
?>
- 执行此文件而不是有错误的脚本文件
现在应该报告有错误的脚本的错误。
这对我很有效。希望它也能解决你的问题!
(PHP 4, PHP 5, PHP 7, PHP 8)
error_reporting — 设置报告哪些 PHP 错误
error_reporting() 函数在运行时设置 error_reporting 指令。PHP 有许多级别的错误,使用此函数设置脚本持续时间(运行时)的错误级别。如果可选的 error_level
未设置,error_reporting() 将只返回当前的错误报告级别。
error_level
新的 error_reporting 级别。它采用位掩码或命名常量。强烈建议使用命名常量以确保与未来版本的兼容性。随着错误级别的增加,整数范围也会增加,因此较旧的基于整数的错误级别不会总是按预期工作。
可用的错误级别常量和这些错误级别的实际含义在 预定义常量 中描述。
版本 | 描述 |
---|---|
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
常量。
如果你只看到一个空白页面而不是错误报告,并且你没有服务器访问权限,所以你不能编辑 php 配置文件,如 php.ini,请尝试以下操作
- 创建一个新文件,在其中包含有错误的脚本
<?php
error_reporting(E_ALL);
ini_set("display_errors", 1);
include("file_with_errors.php");
?>
- 执行此文件而不是有错误的脚本文件
现在应该报告有错误的脚本的错误。
这对我很有效。希望它也能解决你的问题!
E_ALL ^ E_NOTICE 的示例对于我们这些不太精通位运算符的人来说有点令人困惑。
如果你想从当前级别移除通知,无论该未知级别是什么,请使用 & ~
<?php
//....
$errorlevel=error_reporting();
error_reporting($errorlevel & ~E_NOTICE);
//... 生成通知的代码
error_reporting($errorlevel);
//...
?>
^ 是异或(位翻转)运算符,如果通知之前处于关闭状态(在它左侧的错误级别中),它实际上会打开通知。它在示例中起作用是因为 E_ALL 保证设置了 E_NOTICE 的位,因此当 ^ 翻转该位时,它实际上被关闭了。& ~(与非)将始终关闭由右侧参数指定的位,无论它们是处于打开还是关闭状态。
在 PHP 8.0 中,当代码使用 @ 字符时,error_reporting() 不会返回 0。
例如
<?php
$a=$array[20]; // error_reporting() 在 php <8 中返回 0,在 PHP>=8 中返回 4437
?>
在 php7 中,通常是通知或弃用现在是警告:与 mysql 错误相同级别……对我来说是不可接受的。
我确实有数十个旧项目,我当然不想定义我 20 年前写过的每个变量。
因此有两个选择:让 php7 降级我昂贵的 SSD 每小时写入 Gb 或实现类似于服务器级监控的东西(在 php.ini 中使用 auto_[pre-ap]pend_file)并关闭 E_WARNING
自定义覆盖 php 错误级别应该非常方便且灵活……
如果你的 php.ini 中的 display_errors 指令设置为“Off”,无论你设置的报告级别如何,error_reporting() 函数都不会有效。我必须设置
display_errors = On
error_reporting = ~E_ALL
以保持默认情况下没有错误报告,但能够在我的脚本中更改错误报告级别。
我使用的是 PHP 4.3.9 和 Apache 2.0。
请注意,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'] // 注意:没有此索引
?>
在页面的编译过程中,似乎会抛出一些 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。
如果你遇到奇怪的 mysql 警告,例如“警告:mysql_query():你的查询需要完整表扫描……”,不要查找 error_reporting 设置,它是在 php.ini 中设置的。
你可以在脚本中通过以下方法关闭它
ini_set("mysql.trace_mode","Off");
在你的脚本中
http://tinymy.link/mctct
我遇到过这样一个问题:如果出现错误,php 就会给我一个空白页面。任何错误都会强制显示空白页面,而不是任何输出,即使我确保将 error_reporting 设置为 E_ALL,并将 display_errors 启用等等。但仅仅在不同的目录中运行文件就可以显示错误!
事实证明,该目录中的 error_log 文件已满(2.0 Gb)。我删除了该文件,现在错误已正常显示。关闭错误日志记录也可能有所帮助。
https://techysupport.co/norton-tech-support/
为了扩展 chris at ocproducts dot com 的说明,如果你在 error_reporting() 前面加上 @,该函数将始终返回 0。
<?php
error_reporting(E_ALL);
var_dump(
error_reporting(), // E_ALL 的值,
@error_reporting() // 值为 0
);
?>
如果你已经使用 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]]
如果你想在本地环境中查看所有错误,可以在本地将你的项目 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);
}
?>
要为*所有*错误消息(包括所有错误级别,包括 E_STRICT、E_NOTICE 等)启用错误报告,只需使用
<?php error_reporting(-1); ?>
在 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
...
本文引用了这两个报告级别
// 报告所有 PHP 错误(参见变更日志)
error_reporting(E_ALL);
// 报告所有 PHP 错误
error_reporting(-1);
这两个级别有什么区别?
请在本文中更新这两个级别之间的差异和可能的用例的清晰说明。
将 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);
?>
查看有关 php 5.3 已弃用错误的更多信息
https://php.net/manual/en/migration53.deprecated.php
请记住,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 信息性消息?
如果你使用的是 PHP 开发服务器,通过 `php -S servername:port` 从命令行运行,每个错误/通知/警告都将在命令行本身中报告,包括文件名、行号和堆栈跟踪。
因此,如果你想在页面重新加载后仍然保留所有错误的日志(用于调试帮助,可能),运行 PHP 开发服务器可能很有用。
这用于显示在不同版本上可能运行的代码的所有错误
对于 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);
?>
我一直使用 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.
?>
Php >5.4
创建自定义错误处理程序
set_error_handler("customError",E_ALL);
function customError($errno, $errstr)
{
echo "<b>Error:</b> [$errno] $errstr<br>";
echo "Ending Script";
die();
}
只将 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 地址。
如果使用 @ 错误抑制指令,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) 将达到相同的结果。这与上面的说明相反,上面的说明说这两个指令是等效的。