要求对此有正确的想法:
我想在PHP代码中实现一些机制,可以运行 任何外部代码 ,并在其中一个包含失败时调用回调函数({{1 },include
+ require
)。
外部代码意味着正在执行的代码不是由我编写的,也不是对它的控制。它包含在测试中。因此,详细了解夹杂物失效的详细信息是有帮助的。
我遇到的问题是,当发生PHP致命错误时,看起来无法进行回调。
到目前为止我尝试了什么:
*_once
注册错误处理程序 - 不适用于致命错误。set_error_handler
方法创建了一个对象实例 - 未调用致命错误。在其中任何一个中,我只想获取debug_backtrace
,然后使用给出的信息。
不久之后,问题是:如何从PHP代码中跟踪失败的文件包含,然后调用函数。
我担心这个问题的答案不是我最近的尝试和搜索,所以任何有见地的人都会受到高度赞赏。即使你的回答只能加强“不可能”的观点。
此外,如果可以找出将包含哪个文件,那么它也是有用的,因此在包含之前创建调试输出(失败或不失败)至少可以完成。
说明:
相关:
__destruct()
+ register_shutdown_function
)答案 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等),如果找不到要回溯的文件,则抛出异常。