当前位置:首页 > PHP > 正文内容

Thinkphp Call Stack,PHP调用栈Call Stack的获取

高老师7年前 (2019-03-23)PHP1933

ThinkPHP中有一个debug调试功能,能输出报错文件的信息,并能看到这个函数被哪些函数调用,从框架的启动开始记录,特别方便调试。于是研究了下它的底层给予了实现。

<?php

//--框架核心--Start

//框架内置错误处理
function errDealWith($errno, $errstr, $errfile, $errline)
{
    throw new Exception('错误信息:' . $errstr . '错误文件:' . $errfile . '错误行:' . $errline . '错误码:' . $errno);
}

set_error_handler('errDealWith');

//加载框架
try
{
    init();
}
catch (Exception $e)
{
    showDebug($e);
    //showDebug($e->getMessage());
}


//框架调用栈方法
function showDebug($ex)
{
    //错误输出
    var_dump($ex->getMessage());

    //调用栈输出
    var_dump('调用顺序');
    $traces = array_reverse($ex->getTrace());
    foreach ($traces as $item)
    {
        //剔除框架自带的异常函数
        if ($item['function'] != 'errDealWith')
        {
            var_dump($item['function']);
            var_dump($item);
        }
    }
}

//框架初始化方法
function init()
{
    //加载index控制器
    index();
}


//--框架核心--结束


//-----------------------华丽的分割线


//控制器
function index()
{
    //加载新闻的逻辑
    getList();
}


//新闻页面
function getList()
{
    return $list;
}

在上面的代码中存在$list未定义的错误。首先要自定义错误处理函数或类,这里为了演示只是处理了一种错误而已,实际上一个完整的错误处理类是非常庞大的,通过抛出异常再获取getTrace即可实现,开发自己的框架也可以采用。

扫描二维码推送至手机访问。

版权声明:本文由高久峰个人博客发布,如需转载请注明出处。

本文链接:https://blog.20230611.cn/post/77.html

分享给朋友:

“Thinkphp Call Stack,PHP调用栈Call Stack的获取” 的相关文章

PHP单例模式

PHP单例模式

<?php /*  *   单粒模式,只能造出一个对象  1.肯定每次new只能返回一个对象,可以使用静态方法解决  2.子类继承也禁止重写构造方法,添加final搞定  *   */    ...

php异步执行,php后台运行,如何在windows下让php后台运行

php异步执行,php后台运行,如何在windows下让php后台运行

如果想在windows中执行php,并且让php脚本在后台运行,可以用下面的cmd命令start /b php  D:\wwwroot\default\demo1\run.php例如上面的命令意思后台运行run.php,如果想用php编写异步代码: ...

PHP获取站点根目录,PHP获取应用根目录,cgi和cli都支持

PHP获取站点根目录,PHP获取应用根目录,cgi和cli都支持

重构框架的时候想要考虑支持下cli模式,于是参考了thinkphp的底层。/**  * 获取应用根目录  * @return string  */ public static function getRootP...

swoole中的worker_num和task_worker_num

swoole中的worker_num和task_worker_num

(1)swoole启动的主进程是master进程负责全局管理,然后master进程会再fork一个manager进程。(2)manager进程开始统一管理进程创建回收管理。(3)manager进程根据设置的worker_num和task_worker_num来创建work进程和task进程因此启动s...

composer自动加载类库(非psr4规范的文件)

composer自动加载类库(非psr4规范的文件)

在项目下的composer配置文件修改(PaySdk是我这里一个支付sdk的目录,包含各种各样的支付sdk,这样写的意思让composer自动把PaySdk下的所有文件自动加载):"autoload": {      &...

php代理下载,php代下载文件,php下载远程文件,php远程文件下载

php代理下载,php代下载文件,php下载远程文件,php远程文件下载

经常我们下载国外资源容易被墙,可以通过php脚本获取远程文件流然后输出给我们的浏览器来下载。<?php //设置下载文件的url $url = 'https://mirrors.huaweicloud.com/ubuntukylin/ubuntukylin-19....