1

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

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

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

我遇到了一个问题,当发生 PHP 致命错误时,似乎不可能有回调。

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

  • 通过注册错误处理程序set_error_handler- 不适用于致命错误。
  • 使用方法创建了一个对象实例__destruct()- 不会因致命错误而被调用。
  • 注册了一个关闭函数 - 不调用致命错误。

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

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

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

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

评论:

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

有关的:

4

2 回答 2

2

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

如果所需/包含的 php 文件是类,则可以选择自动加载

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

如果您可以将 require/includes 包装在 try catch 块中,将错误处理程序设置为使用异常也可能有效:更新:不起作用:(

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

如果您需要测试的代码可以在命令行中使用popen和 xdebug 进行测试,那么如果返回 -1,您可以在单独的进程中执行程序,pclose您可以从 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
    }
于 2011-07-09T15:44:28.423 回答
0

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

于 2011-07-09T16:04:57.500 回答