php中文网 | cnphp.com

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: php 视频教程
查看: 167|回复: 0

8、错误处理

[复制链接]

58

主题

58

帖子

413

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
413
发表于 2021-5-2 22:20:18 | 显示全部楼层 |阅读模式
[TOC]
## 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 等, 第二个参数时消息字符串
    closelog(): 关闭日志连接



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|php中文网 | cnphp.com

GMT+8, 2021-5-17 16:55 , Processed in 0.023913 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表