要求对此提出体面的想法:
我想在 PHP 代码中实现一些机制,可以运行 任何外部代码 并在其中一个包含失败时调用回调函数( include
, require
+ *_once
)。
外部代码意味着正在执行的代码不是我编写的,也无法控制它。它包含在测试中。因此,深入了解包含失败的详细信息是有帮助的。
我遇到了一个问题,当发生 PHP fatal error 时,似乎不可能有回调。
到目前为止我尝试了什么:
set_error_handler
注册错误处理程序 - 不适用于 fatal error 。 __destruct()
方法创建了一个对象实例 - 调用时不会出现 fatal error 。 在其中任何一个中,我只想获取一个
debug_backtrace
然后使用给定的信息。所以很快的问题是:如何从 PHP 代码中跟踪失败的文件包含然后调用一个函数。
从我最近的尝试和搜索中,我担心这个问题的答案是否定的,所以任何有见地的东西都会受到高度赞赏。即使您的回答只会加强“不可能”这一点。
此外,如果可以找出要包含的文件也很有帮助,因此至少可以在包含(失败与否)之前创建调试输出。
评论:
有关的:
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/