PHP错误处理

PHP 错误类型

  • 语法错误: 通常发生在程序开发时, 可以通过错误报告修复
  • 运行时的错误: 通常程序会继续运行, 但是会显示一条错误信息, 并且某个函数没有成功执行
  • 逻辑错误: 不会提示错误, 程序也能正常执行, 但是不能返回正常结果

错误报告级别

  • E_ERROR: 致命错误, 会阻止脚本执行
  • E_WARNING: 运行时的警告, 非致命错误
  • E_PARSE: 语法解析错误
  • E_NOTICE: 运行时注意的消息, 可能是错误也可能不是
  • E_CODE_ERROR: 类似于 E_ERROR, 但不包含 PHP 核心造成的错误
  • E_CODE_WARNING: 类似于 E_WARNING, 但是不包含 PHP 核心造成的警告
  • E_COMPILE_ERROR: 致命的编译错误
  • E_COMPILE_WARNING: 致命的编译警告
  • E_USER_ERROR: 用户导致的错误
  • E_USER_WARNIGN: 用户导致的警告
  • E_USER_NOTICE: 用户导致的注意消息
  • E_ALL: 所有错误、警告、注意
  • E_STRICT: 关于 PHP 版本移植的兼容性和互操作性建议

调整错误报告级别

  • 全局设置: 在配置文件 php.ini 中修改 error_reporting 的值, 修改后重启 WEB 服务器即可, 此设置会应用于所有的 PHP 文件, 如:

; 可以抛出任意非 notice 的错误
error_reporting=E_ALL & ~E_NOTICE
; 只抛出运行时的致命错误、解析错误、核心错误
error_reporting=E_ERROR|E_PARSE|E_CODE_ERROR
; 抛出除用户造成的错误之外的错误
error_reporting=E_ALL & ~(E_USER_ERROR|E_USER_NOTICE|E_USER_WARNIGN)
  • 临时设置: 在需要设置错误报告级别的 PHP 文件中使用 error_reporting() 函数, 如:

error_reporting(0);                 // 不抛出任何错误
error_reporting(E_ALL);             // 抛出所有错误
error_reporting(E_ALL&~E_NOTICE)    // 抛出非 NOTICE 的错误
  • PHP 错误报告配置指令

display_startup_errors: 是否显示 PHP 引擎初始化时遇到的错误, 默认为 Off
log_errors: 确定日志语句记录的位置, 默认为 Off
error_log: 设置错误可以发送到 syslog 中, 默认为 Null
log_errors_max_len: 每个日志项的最大长度, 以字节为单位, 设置为 0 表示指定最大长度, 默认为 1024
ignore_repeated_errors: 是否忽略同一文件、同一行发生的重复错误, 默认为 Off
ignore_repeated_source: 忽略不同文件中或同一文件中不同行发生的重复错误, 默认为 Off
track_errors: 启用后会在 $php_errormsg 中存储最近发生的错误信息

自定义错误

使用 trigger_error() 函数可以代替 die(), 使用该函数能生成一个用户警告来代替 die() 输出的错误信息, 例如:


trigger_error("没有找到该文件", E_USER_ERROR);

自定义错误处理

使用自定义错误处理的情况:

  • 记下错误信息, 及时发现问题
  • 屏蔽错误
  • 做相应的处理, 将所有的错误放在脚本最后一起输出, 或出错时跳转到预先定义好的错误页面, 如果必要, 还能终止脚本运行
  • 作为调试工具, 用于不影响正在使用的用户时的调试

通常使用 set_error_handler() 函数设置用户自定义的错误处理函数, 用于创建在程序运行时, 使用用户自己的错误处理方法, 返回旧的错误处理程序;若失败, 返回 null。
注意:

  • E_ERROR、E_PARSE、E_CORE_ERROR、E_CORE_WARNING、E_COMPILE_ERROR、E_COMPILE_WARNING 这些错误是不会被捕获的, 会用最原始的方式显示出来
  • 使用了 set_error_handler 函数后, error_reporting 函数就失效了, 除上述错误外所有的错误都交给用户自己处理

错误日志

当产品上线时, 需要第一时间将 display_errors 关闭, 避免暴露路径、数据库链接、数据库表等重要信息, 这时就需要记录错误报告了, 可以直接在 PHP 的配置文件中开启 log_errors 即可, 默认会将错误报告记录到 WEB 服务器的日志文件里

使用指定文件记录错误日志

指定文件记录错误日志一定要确保错误日志保存在根目录之外, 避免被攻击, 并且需要让 WEB 服务有写权限, 并对 PHP 配置文件做如下修改:


error_reporting = E_ALL
display_errors = Off
log_errors = On
log_errors_max_len = 1024
; 指定错误日志存放的文件夹
error_log = D:/Logs/error.log

使用错误日志记录自定义错误的方法见例程

将错误信息记录到操作系统的日志中

Unix/Linux 系统的日志使用的是 syslog, 而 Windows 也和 Unix/Linux 相似, 只是在 Windows 中使用事件查看器查看。需要将消息发送到操作系统日志, 只需对 PHP 配置文件做如下修改:


error_reporting = E_ALL
display_errors = Off
log_errors = On
log_errors_max_len = 1024
error_log = syslog

向 syslog 发送自定义消息

define_syslog_variables(): 在使用 openlog()、syslog()、closelog() 之前必须先调用该函数为他们初始化变量
openlog(): 打开日志器的连接, 为发送消息做准备, 并将提供的第一个字符串参数插入到每个日志消息中
syslog(): 向系统日志发送一条自定义消息, 第一个参数设置消息优先级, 如: LOG_WARNING、LOG_EMERG 等, 第二个参数时消息字符串

日志消息中
syslog(): 向系统日志发送一条自定义消息, 第一个参数设置消息优先级, 如: LOG_WARNING、LOG_EMERG 等, 第二个参数时消息字符串
closelog(): 关闭日志连接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值