设为首页 收藏本站
查看: 790|回复: 0

[经验分享] PHP的错误处理

[复制链接]

尚未签到

发表于 2017-12-29 17:46:20 | 显示全部楼层 |阅读模式
PHP的错误处理机制
  php的错误处理是比较复杂的, 本文讲解php中所有错误相关的重要知识点做一次梳理, 便于理解php的错误机制.

基础知识
  在此之前, 先熟悉一下php手册中 error的基础知识


  • 预定义常量
  • 运行时配置
  • 异常
  • 错误处理函数
预定义常量
  定义了所有php的错误类型常量, 每一个常量都是一个整型数值, 它的作用在于

  常量值(数值或者符号)用于建立一个二进制位掩码,来制定要报告的错误信息。可以使用按位运算符来组合这些值或者屏蔽某些类型的错误。请注意,在 php.ini 之中,只有'|', '~', '!', '^' 和 '&' 会正确解析。

  从使用的角度看, 可以分为三类:


  • 用户手动抛出的  
    E_USER_NOTICE, E_USER_WARNING, E_USER_ERROR, E_USER_DEPRECATED

  • 用户造成的  
    E_NOTICE, E_PARSE, E_WARNING, E_ERROR, E_COMPILE_ERROR, E_COMPILE_WARNING, E_STRICT, E_RECOVERABLE_ERROR

  • php内核造成的  
    E_CORE_ERROR, E_CORE_WARNING

  从是否终止程序执行的角度看, 可分为两类


  •   终止程序执行
      
    程序终止, 进入处理错误流程。

  •   不终止程序执行
      
    产生错误, 但程序仍可以继续执行, 同样会进入错误处理流程;即发生错误,进入处理流程,再继续执行。

  对于PHP中的错误类型, 可以参考这篇更详细的文章--PHP的错误机制总结

运行时配置
  手册--运行时配置讲解的很详细, 但有几个配置仍需特别注意


  •   error_reporting
      
    报告错误的类型, 建议在开发/测试环境配置成E_ALL, 解决所有的类型的错误后, 在生产环境配置E_ALL & E_DEPRECATED, 则表明:报告除废弃错误外的所有错误

  •   display_errors
      
    是否显示错误, 在生产环境中配置成false, 配合上面error_reporting的设置, 则表明: 报告除废弃错误外的所有错误, 但不显示错误信息(即用户看不到).

  •   log_errors
      
    错误记录是否开启, 生产环境需开启. 配合上面的两项配置, 则表明: 报告除废弃错误外的所有错误, 不显示错误信息, 但记录(只有php自己可以操作错误信息)到日志中.

  •   error_log
      
    指定错误的文件(syslog是特殊值).默认未被设置, 手册中:

  如果该配置没有设置,则错误信息会被发送到 SAPI 错误记录器

  一般情况下, 未设置会被记录到apache/nginx的错误日志中. 配合上面三项配置, 则表明: 报告除废弃错误外的所有错误, 不显示错误信息, 但记录到apache/nginx日志中.若配置了文件路径, 则表明: 报告除废弃错误外的所有错误, 不显示错误信息, 但记录到file_dir日志中.
  上面这几项配置影响着php错误最基本的表现.当然,这些配置可以通过 ini_set() 在代码中更改 或 php-fpm配置更改

错误处理函数
  错误函数并不多, 最应该关注的就是set_error_handler 和 set_exception_handler, 因为通过它们可以介入错误/异常的处理流程.

  上面提到过, 错误发生后, 都会进行错误处理流程, 那错误流程如何定义?
  先看看php手册中的讲解: Errors
  简单来说就是, 默认的处理流程就是通过配置完成, 但我们可以设置自定义的错误处理流程


终止脚本执行的错误如何处理
  上文提到过, 错误有两种, 那对于这种会终止脚本执行的错误如何处理?
  
set_error_handler不能处理这种错误, 这一点很容易被忽略. 所以要寻找另一种方法.
  这个问题基本上是这样完成的(还未见过其他方案):
  

// 终止脚本的错误会终止脚本执行  
// 即会调用已通过register_shutdown_function注册的处理函数
  
// 由此可注册我们的错误处理流程, 这样就进入了自定义错误流程
  
register_shutdown_function('fatalErrorHandle');
  

  
...
  

  
function fatalErrorHandle(array $error = null) {
  ...
  if (null === $error) {
  // 通过这种方式可以获取最后一条错误
  $error = error_get_last();
  }
  

  ...
  // log or other logic
  
}
  

异常
  根据w3cPHP 异常处理中的讲解:

  异常处理用于在指定的错误(异常)情况发生时改变脚本的正常流程。这种情况称为异常。
  
当异常被触发时,通常会发生:


  • 当前代码状态被保存
  • 代码执行被切换到预定义的异常处理器函数
  • 根据情况,处理器也许会从保存的代码状态重新开始执行代码,终止脚本执行,或从代码中外的位置继续执行脚本
  未被catch的异常会终止脚本执行并产生一个E-ERROR错误, 执行定义的异常处理, 若无则进行php默认的错误处理流程, 即记录到日志中. 但在编程概念上应该将异常与错误分开, 异常对于用户而言是可预见的, 不符合预期的, 可控制的结构.
  上文提到的set_exception_handler就是处理异常的, 用法与set_error_handler一致. 在各框架中的异常处理很成熟, 大致都是在set_exception_handler中将Exception转移到框架可处理级别, 框架同时会开放良好的接口供用户使用, 从而达到用户控制异常处理的目的, 实现定制和扩展.

总结
  php的错误处理机制总是被忽略, 但它对调试, 监控错误有很大的作用. 本文主要介绍了其中的主要知识点, 并做了一个梳理, 希望对大家有用.更多的细节还请查看手册.

学习资料
  预定义常量
  
运行时配置
  
错误处理函数
  
PHP的错误机制总结
  
异常
  
Errors
  
PHP 异常处理
  
Symfony Debug:是一个完整的应用, 可以说是一个全面的指导教程, 所有与error相关的知识点都涉及到了. 建议阅读源代码.

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-429434-1-1.html 上篇帖子: php调用python脚本 下篇帖子: centos7 编译安装php 5.6
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

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