2009-10-01 3 views
0

Я пытаюсь прочитать файл, когда в моих сценариях возникает ошибка, поэтому я могу отправить страницу пользовательской ошибки.Пользовательские ошибки из файла

При использовании ob_start/set_error_handler я не могу использовать file_get_contents или ob_start в обратном вызове, чтобы получить содержимое моего шаблона ошибки.

Кто-нибудь знает, как я могу вывести свой пользовательский шаблон (и использовать eval) в обратном вызове?


Edit: Некоторый код

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 
+1

Примеры кода всегда добро пожаловать, чтобы уточнить, что вы имеете в виду :) – jakeisonline

ответ

2

Вы должны:

  • знаю, что file_get_contents возвращает ложь, когда он сталкивается с ошибкой.
    • означает, что вы можете проверить возвращаемое значение,
    • и если он вернулся false, вы можете отобразить шаблон
  • также быть осторожным: если есть проблема, она генерирует ошибку, и вы не хочу, чтобы один отображается
    • это та ситуация, в которой вы можете использовать @ operator,
    • к «маска» ошибка - вы проверить, если он повторно свернули ложным, во всяком случае

Это дало бы такой код:

$result = @file_get_contents('non-existing-file'); 
if ($result === false) { 
    echo "An error has occured"; 
} 

Который, в моем случае, дисплеи:

An error has occured 

Теперь до вас, чтобы отобразить ваш шаблон ошибки, в зависимости от структуры, которую вы могли бы использовать, и всего этого ;-)

+0

Pascal, спасибо за ответ ... Файл, к которому я пытаюсь получить доступ, существует, и я проверил путь, просто вернув путь к файлу вместо шаблона. Кажется, файл_get_contents вызывает ошибку, которую я не вижу, хотя я не вижу, что она связана с расположением файла. Я передаю полный путь файла file_get_contents, а не только фактическое имя файла, поэтому проблема CWD не может быть ошибкой. Любые другие идеи были бы высоко оценены! – Gavin

Смежные вопросы