简介
PHP 对一些内部的错误情况进行报错。 这些错误可以用来表示不同的情况,可以根据需要将错误显示出来或记录到日志中。
每个 PHP 产生的错误都包含了类型。可查看 错误类型清单,它附带了不同类型行为的简短描述和 产生的原因。
错误类型清单
值 | 常量 | 说明 |
---|---|---|
1 | E_ERROR (int) |
致命的运行时错误。这类错误一般是不可恢复的情况,例如内存分配导致的问题。后果是导致脚本终止不再继续运行。 |
2 | E_WARNING (int) |
运行时警告 (非致命错误)。仅给出提示信息,但是脚本不会终止运行。 |
4 | E_PARSE (int) |
编译时语法解析错误。解析错误仅仅由分析器产生。 |
8 | E_NOTICE (int) |
运行时通知。表示脚本遇到可能会表现为错误的情况,但是在可以正常运行的脚本里面也可能会有类似的通知。 |
16 | E_CORE_ERROR (int) |
在 PHP 初始化启动过程中发生的致命错误。该错误类似 E_ERROR ,但是是由 PHP 引擎核心产生的。 |
32 | E_CORE_WARNING (int) |
PHP 初始化启动过程中发生的警告 (非致命错误) 。类似 E_WARNING ,但是是由 PHP 引擎核心产生的。 |
64 | E_COMPILE_ERROR (int) |
致命编译时错误。类似 E_ERROR ,但是是由 Zend 脚本引擎产生的。 |
128 | E_COMPILE_WARNING (int) |
编译时警告 (非致命错误)。类似 E_WARNING ,但是是由 Zend 脚本引擎产生的。 |
256 | E_USER_ERROR (int) |
用户产生的错误信息。类似 E_ERROR ,但是是由用户自己在代码中使用 PHP 函数 trigger_error()来产生的。 |
512 | E_USER_WARNING (int) |
用户产生的警告信息。类似 E_WARNING ,但是是由用户自己在代码中使用 PHP 函数 trigger_error()来产生的。 |
1024 | E_USER_NOTICE (int) |
用户产生的通知信息。类似 E_NOTICE ,但是是由用户自己在代码中使用 PHP 函数 trigger_error()来产生的。 |
2048 | E_STRICT (int) |
启用 PHP 对代码的修改建议,以确保代码具有最佳的互操作性和向前兼容性。 |
4096 | E_RECOVERABLE_ERROR (int) |
可被捕捉的致命错误。 它表示发生了一个可能非常危险的错误,但是还没有导致PHP引擎处于不稳定的状态。 如果该错误没有被用户自定义句柄捕获 (参见 set_error_handler()),将成为一个 E_ERROR 从而脚本会终止运行。 |
8192 | E_DEPRECATED (int) |
运行时通知。启用后将会对在未来版本中可能无法正常工作的代码给出警告。 |
16384 | E_USER_DEPRECATED (int) |
用户产生的警告信息。 类似 E_DEPRECATED , 但是是由用户自己在代码中使用PHP函数 trigger_error()来产生的。 |
32767 | E_ALL (int) |
所有错误、警告和通知。 |
示例
开发调试环境
在开发调试环境中,便于开发者第一时间发现错误,一般将错误直接打印到屏幕上。
代码示例:
//设置错误报告级别:报告除了E_NOTICE、E_WARNING以外的所有错误
error_reporting(E_ALL^E_NOTICE^E_WARNING);
//将错误信息输出打印到屏幕
ini_set('display_errors', '1');
生产环境
在生产环境中,通常不在页面中直接显示错误,而是把错误信息记录到日志中。
代码示例:
<?php
//设置错误报告级别:报告所有错误
error_reporting(E_ALL);
//屏幕上不输出错误报告
ini_set('display_errors', 0);
//设置将脚本运行的错误信息记录到服务器错误日志
ini_set("log_errors",1);
//设置错误日志文件的位置
ini_set("error_log", __DIR__."/error.log");
开启了报错仍然不显示错误的解决办法
不显示错误的原因
如果在php.ini
中禁用了display_errors
,然后使用ini_set()
来开启display_errors,则只有在执行包含该ini_set()
行后才会启用。
也就是说,你通过ini_set('display_errors', '1');
开启报错的这个php文件本身不能有错误,否则连ini_set
都没有执行,则无法显示错误信息(因为php.ini里设置了不显示)
解决办法1:
在php.ini中开启报错。
解决办法2:
新写一个php文件(确保不能有语法错误),引入有错误的文件。
示例:
例如如下这个文件(test.php
):
<?php
ini_set('display_errors', '1');
ini_set('display_startup_errors', '1');
error_reporting(E_ALL);
echo 'error'
最后一行忘记写;
,但此时访问test.php时,页面显示500错误,并不显示具体的错误信息。
解决办法是新写一个php文件,并将test.php包含进去。
例如新建一个test2.php
,内容如下:
error_reporting( E_ALL );
ini_set( "display_errors", 1 );
require_once( "test.php" );
此时访问test2.php则可以看到具体的错误信息了。