php - 如何使用回溯跟踪失败的文件包含?

标签 php error-handling include fatal-error backtrace

要求对此提出体面的想法:

我想在 PHP 代码中实现一些机制,可以运行 任何外部代码 并在其中一个包含失败时调用回调函数( includerequire + *_once )。

外部代码意味着正在执行的代码不是我编写的,也无法控制它。它包含在测试中。因此,深入了解包含失败的详细信息是有帮助的。

我遇到了一个问题,当发生 PHP fatal error 时,似乎不可能有回调。

到目前为止我尝试了什么:

  • 通过 set_error_handler 注册错误处理程序 - 不适用于 fatal error 。
  • 使用 __destruct() 方法创建了一个对象实例 - 调用时不会出现 fatal error 。
  • 注册了一个关闭函数 - 不调用 fatal error 。

  • 在其中任何一个中,我只想获取一个 debug_backtrace 然后使用给定的信息。

    所以很快的问题是:如何从 PHP 代码中跟踪失败的文件包含然后调用一个函数。

    从我最近的尝试和搜索中,我担心这个问题的答案是否定的,所以任何有见地的东西都会受到高度赞赏。即使您的回答只会加强“不可能”这一点。

    此外,如果可以找出要包含的文件也很有帮助,因此至少可以在包含(失败与否)之前创建调试输出。

    评论:
  • 最好没有扩展。但是,如果存在某些东西,我也很想知道。
  • 外部代码意味着正在执行的代码不是我编写的,也无法控制它。它包含在测试中。因此,深入了解包含失败的详细信息是有帮助的。


  • 有关的:
  • How can I get PHP to produce a backtrace upon errors?
  • set_error_handler() doens't work for FATAL error (register_shutdown_function + error_get_last)
  • 最佳答案

    我的建议未经测试,这里有一些可以尝试的方法:

    如果所需/包含的 php 文件是类 autoload可能是一种选择

    function __autoload($class)
    {
        // try to load
    }
    

    如果您可以将 require/includes 包装在 try catch block 中,将错误处理程序设置为使用异常也可能有效:更新:不起作用:(
    function exception_error_handler($errno, $errstr, $errfile, $errline ) {
        throw new ErrorException($errstr, $errno, 0, $errfile, $errline);
    }
    set_error_handler("exception_error_handler");
    

    如果您需要测试的代码可以在命令行中使用 popen 进行测试如果 pclose,则 xdebug 会在单独的进程中执行程序返回 -1 你可以从 xdebug 解析回溯。
        $cmd = 'php --php-ini path/php.ini file/to/run.php';
        $output = '';
        $popen  = popen($cmd, 'rb');
    
        while (!feof($popen)) {
            $output .= fread($popen, 4096);
        }
    
        if (pclose($popen) < 0) {
            // error - parse $output for xdebug backtrace
        }
    

    关于php - 如何使用回溯跟踪失败的文件包含?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6635660/

    相关文章:

    php - 我不知道怎么调用它 php/css 错误

    C++ Lua 错误处理

    javascript - 如何在 switch 语句中使用 instanceof

    c - #include 比它出现在程序中更早

    c - 指定 C 库的包含目录

    php - PHP 跨域的 Ajax GET 响应

    php - PDO 错误 - 在非对象上调用成员函数 prepare()

    php - 未定义 $_GET [' ...' ] 索引

    python - 我该怎么做才能解决参数 'Cannot parse arguments with no order' 的错误?

    gradle - 带有cpp-application插件的Gradle,如何设置包含路径?