码农知识堂 - 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

  • 相关阅读:
    一图胜千言!数据可视化多维讲解(Python)
    ASCII纯文本绘制流程图
    使用MySQL
    [附源码]Python计算机毕业设计Django电影院网上售票系统
    Metalama简介2.利用Aspect在编译时进行消除重复代码
    中创算力九月员工生日会 | 愿尔祯祥,岁岁如常
    当我们的执行 java -jar xxx.jar 的时候底层到底做了什么?
    【分享】从Mybatis源码中,学习到的10种设计模式
    EC2日志内容推送至CloudWatch
    图的学习,深度和广度遍历
  • 原文地址:https://www.cnblogs.com/HKUI/p/php-error-exception-log-debug.html
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号