我正在尝试在脚本中发生错误时读取文件,因此我可以抛出自定义错误页面。
使用ob_start / set_error_handler时,我无法在回调中使用file_get_contents或ob_start来获取错误模板的内容。
有人知道如何在回调中输出我的自定义模板(以及使用eval)吗?
编辑:一些代码
error_reporting(E_ALL);
ini_set("display_errors", 1);
function fatal_error_handler($buffer) {
if (ereg("(error</b>:)(.+)(<br)", $buffer, $regs) ) {
$ErrorString = preg_replace("/<.*?>/","",$regs[2]);
error_log($ErrorString);
$template = file_get_contents(sprintf('%s/errors/Error.php', TEMPLATES));
return eval(sprintf('?>%s<?', $template);
//return "ERROR CAUGHT check log file";
}
return $buffer;
}
function handle_error ($errno, $errstr, $errfile, $errline)
{
error_log("$errstr in $errfile on line $errline");
if($errno == FATAL || $errno == ERROR){
ob_end_flush();
echo "ERROR CAUGHT check log file";
exit(0);
}
}
ob_start("fatal_error_handler");
set_error_handler("handle_error");
上面只显示一个空白页面。
error_reporting(E_ALL);
ini_set("display_errors", 1);
function fatal_error_handler($buffer) {
if (ereg("(error</b>:)(.+)(<br)", $buffer, $regs) ) {
$ErrorString = preg_replace("/<.*?>/","",$regs[2]);
error_log($ErrorString);
ob_start();
include(sprintf('%s/errors/Error.php', TEMPLATES));
$template = ob_get_contents();
ob_end_clean();
return eval(sprintf('?>%s<?', $template));
//return "ERROR CAUGHT check log file";
}
return $buffer;
}
function handle_error ($errno, $errstr, $errfile, $errline)
{
error_log("$errstr in $errfile on line $errline");
if($errno == FATAL || $errno == ERROR){
ob_end_flush();
echo "ERROR CAUGHT check log file";
exit(0);
}
}
ob_start("fatal_error_handler");
set_error_handler("handle_error");
以上给出了以下内容:
Fatal error: ob_start() [<a href='ref.outcontrol'>ref.outcontrol</a>]: Cannot use output buffering in output buffering display handlers in /var/www/index.php on line 16
答案 0 :(得分:2)
你必须:
file_get_contents
在遇到错误时返回false。
false
,则可以显示模板它会提供这种代码:
$result = @file_get_contents('non-existing-file');
if ($result === false) {
echo "An error has occured";
}
在我的情况下,显示:
An error has occured
现在,由您决定显示您的错误模板,具体取决于您可能正在使用的框架以及所有这些; - )