首页 PHP常见问题

常用模块之PHP错误处理!

From: https://zhuanlan.zhihu.com/p/88652324

错误处理

第1章 错误报告级别

PHP 程序的错误一般归属于下列三个领域:

语法错误:

​ 语法错误最常见,并且也容易修复。如:代码中遗漏一个分号。这类错误会阻止脚本的执行。

运行时错误:

​ 这种错误一般不会阻止PHP脚本的执行,但会阻止当前要做的事情。输出一条错误,但php脚本继续执行。

逻辑错误:

​ 这种错误最麻烦,既不阻止脚本执行,也不输出错误消息。

案例:

在 PHP 系统中,到底有哪些错误报告级别?

在 php.ini 中可以找到错误级别的说明和设置。


在实际的开发中,没有人关注什么错误级别错误值什么的,报错了,看一眼大概啥类型的,直接找BUG就行了。

在实际的开发中,我们其实需要做大量的错误处理,写功能比较容易,无非就是增删改查,就像汽车,让一辆汽车开起来并不难,但如果要做各种安全防护,就要麻烦的多,考虑的因素也非常多,说明书厚的跟字典一样。

第2章 调整错误报告级别

动态设置 PHP 错误信息是否输出,只在当前脚本生效,并不会影响php.ini全局的设置。

  • display_errors: 是否开启PHP输出错误报告的功能。

​ 值为:On(默认输出错误报告)、 Off(屏蔽所有错误信息)

​ 在PHP脚本中可调用ini_set( )函数,动态设置php.ini配置文件.

​ 如:ini_set("display_errors","On"); //显示所有错误信息

  • error_reporting: 设置不同的错误报告级别。

​ error_reporting = E_ALL & ~E_NOTICE

​ -- 可以抛出任何非注意的错误,默认值。

​ error_reporting = E_ERROR | E_PARSE | E_CORE_ERROR

​ -- 只考虑致命的运行时错误、新解析错误和核心错误。

​ error_reporting = E_ALL & ~(E_USER_ERROR | E_USER_WARNING | E_USER_NOTICE)

​ -- 报告除用户导致的错误之外的所有错误。

​ 在PHP脚本可以通过error_reporting( )函数动态设置错误报告级别。如:error_reporting(E_ALL);

案例:

php.ini 中错误设置选项(了解即可,无需深究)。

第3章 PHP 日志的记录方式

1)采用文件记录 (推荐使用)。

2) 错误日志记录到操作系统日志中。

思考:为什么要做日志记录?

​ 1.方便自己开发的时候查询,框架一般都自带日志功能,只需要开启就OK。

​ 2.可以借助运行日志开发相应的后台日志功能,给管理员查询,方便管理。

3.1 采用文件记录

先配置 php.ini 文件

试验:

以上记录的是系统报错的日志。

思考:我能不能做一个用户操作的人为的日志?

使用函数:在 PHP 文件中使用 error_log() 来记录日志,就可以将信息写入到 myerror.log 文件中。

参数参考手册。

rigger_error() 函数记录日志

上一节中,我们使用error_log()报一个自定义的错误信息,让系统记录,只记录信息。

而使用 trigger_error() 比 error_log 更加灵活一些,可指定等级和文件位置。

3.2 错误日志记录到操作系统日志中

先配置 php.ini 文件

使用四个函数来记录日志:

试验:

目前的开发已经淘汰这种方式,4个函数必须同时使用,课后可自行试验,代码如下:

如何查看 Window 系统日志。

计算机右键 ---> 管理(G) ---> 系统工具 ---> 事件查看器 ---> Windows 日志 ---> 应用程序



第4章 自定义错误处理

​ 自定义错误报告的处理方式,可以完全绕过标准的PHP错误处理函数,这样就可以按自己定义的格式打印错误报告,或改变错误报告打印的位置。

​ 说白了就是不使用系统的错误提示,改为自己的。

set_error_handler() -- 设置用户自定义错误处理。

$error_handler$error_types

回调函数:回来调取函数。

所谓的回调函数:

案例:

特别注意:E_ERROR、E_PARSE、E_CORE_ERROR、E_CORE_WARNING、E_COMPILE_ERROR、E_COMPILE_WARNING是不会有效果的,通常会用原始的方式显示。