2009-10-01 7 views
0

J'essaie de lire un fichier lorsqu'une erreur se produit dans mes scripts afin que je puisse lancer une page d'erreur personnalisée. Lorsque j'utilise ob_start/set_error_handler, je ne parviens pas à utiliser file_get_contents ou ob_start dans le rappel pour obtenir le contenu de mon modèle d'erreur lors de l'utilisation deErreurs personnalisées à partir d'un fichier

Est-ce que quelqu'un sait comment je peux afficher mon modèle personnalisé (et utiliser eval) dans le rappel?


Edit: Une partie du code

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"); 

ci-dessus affiche juste une page vide.

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"); 

et donne au-dessus de ce qui suit:

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

Exemples de code toujours bienvenue pour clarifier ce que vous voulez dire :) – jakeisonline

Répondre

2

Vous devez:

  • savent que file_get_contents renvoie false lorsqu'il rencontre une erreur.
    • qui signifie que vous pouvez tester la valeur de retour,
    • et si elle est revenue false, vous pouvez afficher votre modèle
  • aussi faire attention: quand il y a un problème, il génère une erreur, et vous ne veulent pas que l'on affiche
    • c'est le genre de situation que vous pouvez utiliser le @ operator,
    • à « masque » l'erreur - tester si elle re tourné faux, de toute façon

Cela donnerait ce genre de code:

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

Ce qui, dans mon cas, affiche:

An error has occured 

Maintenant, à vous d'afficher votre modèle d'erreur, en fonction du Framework que vous utilisez et de tout cela ;-)

+0

Pascal, merci d'avoir répondu ... Le fichier auquel j'essaie d'accéder existe et j'ai vérifié le chemin en retournant simplement le chemin du fichier au lieu du template. Il semble que file_get_contents renvoie une erreur que je ne peux pas voir, bien que je ne la vois pas liée à la localisation du fichier. Je passe le chemin complet du fichier à file_get_contents plutôt que juste le nom de fichier réel afin que le problème CWD ne soit pas en cause. Toute autre idée serait grandement appréciée! – Gavin

Questions connexes