当前位置 : 主页 > 编程语言 > 其它开发 >

php错误/异常/日志及常见调试和排错

来源:互联网 收集:自由互联 发布时间:2022-05-21
目录 错误和异常 错误 异常 错误异常继承关系 php7下的常见错误异常类型 错误和异常的有关主要配置 错误/异常有关处理函数 set_exception_handler set_error_handler register_shutdown_function Yii里的

目录
  • 错误和异常
    • 错误
    • 异常
    • 错误异常继承关系
    • php7下的常见错误异常类型
    • 错误和异常的有关主要配置
    • 错误/异常有关处理函数
      • set_exception_handler
      • set_error_handler
      • register_shutdown_function
      • Yii里的异常和错误处理
    • 常见的查错
      • 去哪找日志,陌生的项目怎么快速的找到日志
      • 不找日志,重置错误处理
    • 常用调试
      • 基本简单的调试
      • 调用栈追踪
      • 其它工具
        • Yii的debugger tool
        • whoops(类似yii debugger tool)
        • chrome控制台
      • 性能调试
        • xhprof+xhgui
        • xhprof

错误和异常 错误

php程序自身的问题,一般是由非法的语法,环境问题导致

异常

一般是业务逻辑上出现的不合预期、与正常流程不同的状况,不是语法错误

错误异常继承关系

小括号表示php版本

php7下的常见错误异常类型 常见错误/异常代码 类型 try/catch set_error_handler set_exception_handler register_shutdown_function(均触发) include/require "aaa" 错误 ❌ ✔ ❌ undefined() 异常 ✔ ❌ ✔ $arr=["a"=>1];echo $arr['b']; 错误 ❌ ✔ ❌ echo 1/0; 错误 ❌ ✔ ❌ intdiv(1,0) 异常 ✔ ❌ ✔ define("A",1);define("A",1); 错误 ❌ ✔ ❌ function a(); function a();//或者类的重复定义 错误 ❌ ❌ ❌ function add($a,$b){return $a+$b;} add(1); add(1,2,3);//自动忽略了多余的 异常 ✔ ❌ ✔ $a=1; foreach ($a as $k=>$v){ echo $k."--".$v; } 错误 ❌ ✔ ❌ include "parseError.php"; //parseError.php 有语法错误 异常 ✔ ❌ ✔ $a=null; $a->fun(); 异常 ✔ ❌ ✔ 错误和异常的有关主要配置
log_errors //开启记录错误日志
display_errors  //是否在页面展示错误日志
error_reporting //错误级别
error_log
    如果该配置没有设置,则错误信息会被发送到 SAPI 错误记录器。
    例如,出现nginx的错误日志中,或者在CLI中发送到 stderr
    配置优先级别fpm>ini>nginx
错误/异常有关处理函数

https://www.php.net/manual/zh/ref.errorfunc.php

set_exception_handler

在exception_handler 调用后异常会中止
只能设置1个,未设置则返回NULL,再次设置返回上次的handler(5.5+),设置为NULL和restore_exception_handler()作用类似

set_error_handler

以下级别的错误不能由用户定义的函数来处理,独立于发生错误的地方: E_ERROR、 E_PARSE、 E_CORE_ERROR、 E_CORE_WARNING、 E_COMPILE_ERROR、 E_COMPILE_WARNING,和在 调用 set_error_handler() 函数所在文件中产生的大多数 E_STRICT
如果错误发生在脚本执行之前,将不会 调用自定义的错误处理程序因为它尚未在那时注册
传入 null 重置处理程序到默认状态,同restore_error_handler()

handler里error_types 里指定的错误类型都会绕过 PHP 标准错误处理程序, 除非回调函数返回了 false
如果handler返回 false,标准错误处理处理程序将会继续调用

register_shutdown_function

不影响error_log的行为,可以多个

Yii里的异常和错误处理
  1. 出现错误-> 触发->错误的处理handler->错误处理handler抛出异常-》触发异常处理的hander->写日志/格式化输出
  2. 出现异常->触发异常处理的hander→写日志/格式化输出
  3. 出现fatal错误→触发 register_shutdown_function的handler->写日志/格式化输出
常见的查错 去哪找日志,陌生的项目怎么快速的找到日志

1.去error_log文件找(php-fpm.conf→php.ini→nginx的error_log) 一定要注意日志文件的权限(fpm 的worker进程是否可写)
2.找set_exception_handler,set_error_handler的返回

不找日志,重置错误处理

不想管自定义的错误处理
把错误,异常处理的handeler全部重置掉,只去标准里去找即可

error_reporting(E_ALL);
ini_set("display_errors","On");
restore_exception_handler();
restore_error_handler();
常用调试 基本简单的调试
var_dump(),print_r(),var_export()
Yii框架的帮助函数 比如 yii\helpers\VarDumper::dump/dumpAsString());
调用栈追踪

1.debug_backtrace(int $options = DEBUG_BACKTRACE_IGNORE_ARGS, int $limit = 0)
调用到此处,调用链关系,根据需要传需要的参数,节省开销
2.get_included_files()
按顺序打印加载文件的顺序助于调试
比如常驻的(swoole,workerman)可以通过这个看,修改某个php文件(此处是不是已经加载到内存),用不用重启服务

其它工具 Yii的debugger tool

为了调试方便对其他人不产生影响,可使用种cookie方式开启(外加ip白名单)方式,比较适合yii混编的页面调试

辅助配套的cookie-editor插件

https://chrome.google.com/webstore/detail/cookie-editor/iphcomljdfghbkdcfndaijbokpgddeno?hl=zh-CN

whoops(类似yii debugger tool)


点击左边可以代码到那里

chrome控制台

https://github.com/ccampbell/chromephp

页面有刷新跳转时 可以开启console日志保持模式

性能调试 xhprof+xhgui

xhprof

网友评论