如何使用backtrace跟踪失败的文件包含?

时间:2011-07-09 15:24:23

标签: php error-handling include fatal-error backtrace

要求对此有正确的想法:

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

外部代码意味着正在执行的代码不是由我编写的,也不是对它的控制。它包含在测试中。因此,详细了解夹杂物失效的详细信息是有帮助的。

我遇到的问题是,当发生PHP致命错误时,看起来无法进行回调。

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

  • 通过*_once注册错误处理程序 - 不适用于致命错误。
  • 使用set_error_handler方法创建了一个对象实例 - 未调用致命错误。
  • 注册了关机功能 - 未对致命错误进行调用。

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

不久之后,问题是:如何从PHP代码中跟踪失败的文件包含,然后调用函数。

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

此外,如果可以找出将包含哪个文件,那么它也是有用的,因此在包含之前创建调试输出(失败或不失败)至少可以完成。

说明:

  • 优先不使用扩展名。但是如果存在某些东西,我也很想知道。
  • 外部代码意味着正在执行的代码不是由我编写的,也不是对它的控制。它包含在测试中。因此,详细了解夹杂物失效的详细信息是有帮助的。

相关:

2 个答案:

答案 0 :(得分:2)

我的建议未经测试,以下是一些尝试:

如果必需/包含的php文件是类autoload可以是一个选项

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

如果你可以在try catch块中设置require / includes设置错误处理程序以使用异常可能也可以工作:更新:不起作用:(< / p>

function exception_error_handler($errno, $errstr, $errfile, $errline ) {
    throw new ErrorException($errstr, $errno, 0, $errfile, $errline);
}
set_error_handler("exception_error_handler");

如果您需要测试的代码可以使用popen和xdebug在命令行中进行测试,那么如果pclose返回-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
    }

答案 1 :(得分:0)

你不需要它。要加载类,请使用__autoload函数。要包含静态文件,请使用require_once。要加载dinamic文件,您应该在使用之前检查它们(file_exeists,is_readable等),如果找不到要回溯的文件,则抛出异常。