php 打印错误 display,php错误display及error_reporting的使用

今日在开发中,遇到线上服务器不记录变量不存在的错误日志,那么是怎么回事呢?

于是开始查找 index.php 中的代码switch (ENVIRONMENT) {

case 'development':

error_reporting(-1);

ini_set('display_errors', 0);

break;

case 'testing':

case 'production':

ini_set('display_errors', 0);

if (version_compare(PHP_VERSION, '5.3', '>=')) {

error_reporting(E_ALL & ~E_NOTICE & ~E_DEPRECATED & ~E_STRICT & ~E_USER_NOTICE & ~E_USER_DEPRECATED);

}

else {

error_reporting(E_ALL & ~E_NOTICE & ~E_STRICT & ~E_USER_NOTICE);

}

break;

default:

header('HTTP/1.1 503 Service Unavailable.', TRUE, 503);

echo 'The application environment is not set correctly.';

exit(1); // EXIT_ERROR

}

线上代码是 production 生产环境, 是执行:error_reporting(E_ALL & ~E_NOTICE & ~E_STRICT & ~E_USER_NOTICE);

这句话的代码是什么意思呢?

所有日志,除了了E_NOTICE  E_STRICT  以及E_USER_NOTICE 这三个错误以外的错误才提示和记录,

变量不存在,属于 Notice 这个层次的

开发环境:可以正常记录,变量不存在

ERROR - 2018-06-12 17:29:58 --> Severity: Notice --> Undefined index: success D:\phpStudy\WWW\jifen\wangyu\app\helpers\funs_helper.php 158

生产环境:不记录了

原因就是:error_reporting(E_ALL & ~E_NOTICE & ~E_STRICT & ~E_USER_NOTICE);

打开错误:

打开所有的错误,全部输出:这是开发环境

ini_set('display_errors',1);

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

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

error_reporting=E_ALL &  ~E_NOTICE

意思是报告所有的错误,但除了E_NOTICE这一种。这也是最常用的错误报告级别,它不会报告注意类(如:使用了未定义的变量)的错误。

下面列举一些错误报告级别:

值          常量                     说明

1           E_ERROR             报告导致脚本终止运行的致命错误

2           E_WARNING       报告运行时的警告类错误(脚本不会终止运行)

4           E_PARSE             报告编译时的语法解析错误

8           E_NOTICE           报告通知类错误,脚本可能会产生错误

32767   E_ALL                  报告所有的可能出现的错误(不同的PHP版本,常量E_ALL的值也可能不同)

error_reporting(E_ALL ^ E_NOTICE);    // 除了E_NOTICE之外,报告所有的错误

error_reporting(E_ALL & ~E_NOTICE);  // 除了E_NOTICE之外,报告所有的错误 这两种意思一样

error_reporting(E_ERROR);       // 只报告致命错误

echo error_reporting(E_ERROR | E_WARNING | E_NOTICE);   // 只报告E_ERROR、E_WARNING 和 E_NOTICE三种错误

注意:配置文件php.ini中display_errors的默认值为On,代表显示错误提示,如果设置为Off,就会关闭所有的错误提示。

可以通过程序动态去设置  错误是否开启和关闭:ini_set('display_error');

ini_get('display_errors');  可以获取当前php运行 错误报告的状态。

特别告知: Notice  和 Warning 运行出错的时候,程序不会停止,会继续运行。

477f4092ba0460e5da073c6f02f2646f.png

class Err{

protected $debug;

public function __construct($debug=true){

$this->debug=$debug;

}

public function error(){

error_reporting(0);

set_error_handler([$this,'handle'],E_ALL|E_STRICT);

}

public function handle($code,$error,$file,$line){

echo $error;

print_r($file);

}

}

(new Err())->error();

echo $a;

4b0570dbd937d93fbfa182de8bf6af16.png

### PHP `error_reporting` 函数详解 #### 什么是 `error_reporting()`? `error_reporting()` 是 PHP 中的一个内置函数,用于设置运行时的错误报告级别。通过该函数可以动态调整哪些类型的错误会被记录或显示给用户[^1]。 #### 基本语法 以下是 `error_reporting()` 的基本语法: ```php int error_reporting ([ int $level ] ) ``` - **参数**: `$level` 表示要启用的错误报告级别的位掩码组合。 - 如果不传递任何参数,则会返回当前的错误报告级别。 #### 错误报告常量 PHP 提供了一系列预定义的常量来表示不同的错误类型。这些常量可以通过按位 OR (`|`) 组合在一起以指定多个错误类型。常见的错误报告级别包括: - `E_ERROR`: 致命的运行时错误。 - `E_WARNING`: 运行时警告(非致命错误)。 - `E_PARSE`: 解析错误。 - `E_NOTICE`: 运行时通知。 - `E_ALL`: 所有错误和警告。 - `E_STRICT`: 启用 PHP 建议更改的方式以及向后兼容性问题的通知。 - `0`: 关闭所有错误报告[^3]。 #### 示例代码 下面是一些关于如何配置不同错误报告级别的例子: ##### 报告所有可能的错误 如果希望捕获尽可能多的信息以便调试程序,可以选择报告所有错误: ```php <?php error_reporting(E_ALL); ?> ``` ##### 只报告错误而不报告通知 有时开发者只想关注更严重的错误而不是轻微的通知消息: ```php <?php error_reporting(E_ERROR | E_WARNING | E_PARSE); ?> ``` ##### 完全关闭错误报告 当部署到生产环境时,通常会选择隐藏所有错误以免暴露敏感信息: ```php <?php error_reporting(0); // 不再报告任何错误 ini_set('display_errors', '0'); // 确保不会在页面上显示错误 ?> ``` #### 结合其他配置项使用 除了 `error_reporting()` 外,还可以配合 `ini_set()` 来进一步定制行为。例如,在某些情况下不仅需要屏蔽前端可见的错误输出还需要延长执行时间防止因长时间操作引发中断等问题[^2]: ```php <?php // 关闭错误显示 error_reporting(0); ini_set('display_errors', '0'); // 修改最大执行时间为无限期或者适当增加秒数 set_time_limit(0); // 或者 set_time_limit(300) 设定为五分钟后停止 ?> ``` 以上方法能够有效帮助管理应用程序中的异常情况并提升用户体验质量的同时保护服务器安全不受未授权访问威胁影响。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值