码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • php错误/异常/日志及常见调试和排错


    目录
    • 错误和异常
      • 错误
      • 异常
      • 错误异常继承关系
      • 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

  • 相关阅读:
    golang 断点调试
    快速掌握jmeter(二)——控制器与beanshell实现csv自动化测试模板
    基于深度学习的三维重建从入门实战教程 原理讲解 源码解析 实操教程课件下载
    看看redis的数据结构你都知道哪些
    快乐数 | LeetCode-203 | 一个简单的数学题!| Floyd判圈算法练习题 | 哈希集合 | 数学
    Linux nohup命令
    PageHelper基础知识
    图片后缀和ContentType大全
    第2-4-5章 规则引擎Drools高级语法-业务规则管理系统-组件化-中台
    rviz配置文件是什么
  • 原文地址:https://www.cnblogs.com/HKUI/p/php-error-exception-log-debug.html
  • 最新文章
  • 【JVM】编译执行与解释执行的区别是什么?JVM 使用哪种方式?
    用 Hashids 优雅解决 C 端自增 ID 暴露问题
    V8引擎 精品漫游指南--Ignition篇(上) 指令 栈帧 槽位 调用约定 内存布局 基础内容
    LLVM Pass快速入门(四):代码插桩
    milkup:桌面端 markdown AI续写和即时渲染
    基于项目工程构建SBOM(软件物料清单)的研究
    鸿蒙应用开发UI基础第二节:鸿蒙应用程序框架核心解析与实操
    .NET 中如何快速实现 List 集合去重?
    扣子Coze实战:从0到1打造抖音+小红书热点监控智能体
    浅谈数据访问层
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号